Sorry for all of the packages. They grew and grew and grew, and I don’t want to refactor everything to reduce the dependencies.

source(file.path(r_path, "move_to_species.R"))
Error in file.path(r_path, "move_to_species.R") : 
  object 'r_path' not found

Read in the spreadsheet and take a look at the data.

# data path
loc_path <- here::here("data", "all species New_6-14-19.xlsx")

### read in spreadsheet
loc <- read_xlsx(loc_path) %>%
  janitor::clean_names() %>% 
  mutate(reproductive_mode = as.factor(reproductive_mode)) 

#get the number of individuals, and the sexuality counts per species
count_repro_mode <- loc %>% 
  group_by(genus, species, reproductive_mode) %>% 
  dplyr::count() %>% 
  mutate(genus_species = str_c(genus, species, sep = "_"),
         genus_species = str_replace_all(genus_species, " ", "_"),
         genus_species = str_replace_all(genus_species, "\\.", "")) %>% 
  ungroup() %>% 
  mutate(genus_species = fct_reorder(genus_species, n, sum)) %>% 
  ggplot(aes(x = genus_species, y = n, fill = reproductive_mode)) +
  geom_col() +
  coord_flip() + 
  theme_minimal()

count_repro_mode

Map

Plot a leaflet map of the localities. The leaflet map is interactive. You can click on the localities and a flag with some metadata will pop up!

PCA-Genera

PCA by locality

This is a PCA of the climate data extracted for each locality, rather than a PCA of the total climate space. This gives us a general idea of differences in environmental niche.

Run the pca and check out variable loadings and proportion of variance explained by components.

Two plots: One plot of the PCA colored according to genus, with convex hulls surrounding the genera. It looks like this reflects a latitudinal gradient in temperature! You can interact with the PCA plot by clicking on points to view associated metadata. You can isolate the genus you want to view by double clicking the genus in the legend! You can also remove a genus by clicking on it once. There’s some other functionality you can explore in the toolbar at the top of the plot. The second plot is a PCA colored according to reproductive mode. It looks like asexual populations occupy slightly larger niche space, but both reproductive modes have a similar niche center.

Examining whether asexual populations occupy more unstable climates than sexual populations. Only using species with multiple sexual and asexual populations. Asexual pops tend to occupy more stable temperature environments, but less stable precipitation environments. We’re estimating stability using the method presented by Owens and Guralnick 2019- climateStability: AN R PACKAGE TO ESTIMATE CLIMATE STABILITY FROM TIME-SLICE CLIMATOLOGIES.

### Creating temperature and precipitation stability layers
### Using bio1 (average temp) and bio12 (average precip)
### 2.5 arcmin resolution, already cropped to NZ to speed up computation time


#time slices are calculated as the difference between the midpoints of the two time periods the climate layers were calculated for (e.g. midpoint of LH = (4.2 ka - 0.3 ka) / 2 + 0.3 ka = 2.25, midpoint of MH = (8.326 ka - 4.2 ka) / 2 + 4.2 = 6.263. time_slice = 6.263 - 2.25 = 4.013)
time_slices <- c(2550, 4013, 6037, 1500, 2050, 5150)

precip_path <-
  here::here("data",
       "climate",
       "paleoclim_late_pleistocene",
       "precipitation")

precip_deviation <-
  climateStability::deviationThroughTime(variableDirectory = precip_path, timeSlicePeriod = time_slices)

precip_stability <- (1 / precip_deviation)
precip_stability_scaled <- climateStability::rescale0to1(precip_stability)

temp_path <-
  here::here("data",
       "climate",
       "paleoclim_late_pleistocene",
       "temperature")

temp_deviation <-
  climateStability::deviationThroughTime(variableDirectory = temp_path, timeSlicePeriod = time_slices)

temp_stability <- (1 / temp_deviation)
temp_stability_scaled <- climateStability::rescale0to1(temp_stability)

overall_stability_scaled <- precip_stability_scaled * temp_stability_scaled

temp_stability_map <- ggplot() +
  ggspatial::layer_spatial(data = temp_stability_scaled) +
  labs(title = "Temperature stability") +
  scale_fill_viridis_c(na.value = "transparent") +
  theme_minimal()

precip_stability_map <- ggplot() +
  ggspatial::layer_spatial(data = precip_stability_scaled) +
  labs(title = "Precipitation stability") +
  scale_fill_viridis_c(na.value = "transparent") +
  theme_minimal()

overall_stability_map <- ggplot() +
  ggspatial::layer_spatial(data = overall_stability_scaled) +
  labs(title = "Overall stability") +
  scale_fill_viridis_c(na.value = "transparent") +
  theme_minimal()

temp_stability_map
precip_stability_map
overall_stability_map

# write maps to file
map_path <- here::here("output", "maps")

ggsave("temp_stability.png",
       plot = temp_stability_map,
       device = "png",
       path = map_path,
       dpi = "retina")

ggsave("precip_stability.png",
       plot = precip_stability_map,
       device = "png",
       path = map_path,
       dpi = "retina")

ggsave("overall_stability.png",
       plot = overall_stability_map,
       device = "png",
       path = map_path,
       dpi = "retina")

Plot stability across species.


# filter for relevant species and asexual reproductive mode
asexual_locs <- loc %>%
  mutate(lat_long = str_c(latitude, longitude)) %>%
  filter(
    reproductive_mode == "asexual",
    species == "horridus" |
      species == "jucundum" |
      species == "hookeri" |
      species == "annulata" |
      species == "ovobessus" |
      species == "huttoni",
    !duplicated(lat_long)
  ) %>%
  dplyr::select(longitude, latitude)

# filter for relevant species and sexual reproductive mode
sexual_locs <- loc %>%
  mutate(lat_long = str_c(latitude, longitude)) %>%
  filter(
    reproductive_mode == "sexual",
    species == "horridus" |
      species == "jucundum" |
      species == "hookeri" |
      species == "annulata" |
      species == "ovobessus" |
      species == "huttoni",
    !duplicated(lat_long)
  ) %>%
  dplyr::select(longitude, latitude)

# extract preciptitation values and bind into a new dataframe
precip_asexual <-
  raster::extract(precip_stability_scaled, asexual_locs) %>%
  enframe(name = NULL, value = "precip_stability_scaled") %>%
  mutate(reproductive_mode = "asexual")

precip_sexual <-
  raster::extract(precip_stability_scaled, sexual_locs) %>%
  enframe(name = NULL, value = "precip_stability_scaled") %>%
  mutate(reproductive_mode = "sexual")

precip_df <- bind_rows(precip_asexual, precip_sexual)

# plot precipitation stability
precip_stability_plot <- ggplot(
  data = precip_df,
  aes(x = reproductive_mode, y = precip_stability_scaled, fill = reproductive_mode)
) +
  geom_violin(width = 0.8) +
  geom_boxplot(width = 0.1,
               color = "gray",
               fill = "transparent") +
  scale_fill_viridis_d(option = "magma") +
  theme_dark()

precip_stability_plot

# extract temperature values and bind into a new data frame
temp_asexual <-
  raster::extract(temp_stability_scaled, asexual_locs) %>%
  enframe(name = NULL, value = "temp_stability_scaled") %>%
  mutate(reproductive_mode = "asexual")

temp_sexual <-
  raster::extract(temp_stability_scaled, sexual_locs) %>%
  enframe(name = NULL, value = "temp_stability_scaled") %>%
  mutate(reproductive_mode = "sexual")

temp_df <- bind_rows(temp_asexual, temp_sexual)

# plot temperature stability
temp_stability_plot <- ggplot(data = temp_df,
       aes(x = reproductive_mode, y = temp_stability_scaled, fill = reproductive_mode)) +
  geom_violin(width = 0.8) +
  geom_boxplot(width = 0.1,
               color = "gray",
               fill = "transparent") +
  scale_fill_viridis_d(option = "magma") +
  theme_dark()

temp_stability_plot

# extract overall stability values and bind into a dataframe
overall_asexual <-
  raster::extract(overall_stability_scaled, asexual_locs) %>%
  enframe(name = NULL, value = "overall_stability_scaled") %>%
  mutate(reproductive_mode = "asexual")

overall_sexual <-
  raster::extract(overall_stability_scaled, sexual_locs) %>%
  enframe(name = NULL, value = "overall_stability_scaled") %>%
  mutate(reproductive_mode = "sexual")

overall_df <- bind_rows(overall_asexual, overall_sexual)

# plot overall stability
overall_stability_plot <- ggplot(
  data = overall_df,
  aes(x = reproductive_mode, y = overall_stability_scaled, fill = reproductive_mode)
) +
  geom_violin(width = 0.8) +
  geom_boxplot(width = 0.1,
               color = "gray",
               fill = "transparent") +
  scale_fill_viridis_d(option = "magma") +
  theme_dark()

overall_stability_plot

# save plots
plot_path <- here::here("output", "plots")
ggsave("temp_stability_plot.png",
       plot = temp_stability_plot,
       device = "png",
       path = plot_path,
       dpi = "retina")

ggsave("precip_stability_plot.png",
       plot = precip_stability_plot,
       device = "png",
       path = plot_path,
       dpi = "retina")

ggsave("overall_stability_plot.png",
       plot = overall_stability_plot,
       device = "png",
       path = plot_path,
       dpi = "retina")

PCA-Species

These are PCAs of environmental space for species within genera. Each climate PCA is of localities for a single genus, colored by species. I’m doing this even for genera with one species, so it’s easy to see if certain localities group together.

Argosarchus

Ignoring unknown aesthetics: text

Assuming "longitude" and "latitude" are longitude and latitude, respectively

Importance of components:
                          PC1    PC2    PC3    PC4     PC5     PC6
Standard deviation     2.8521 2.4343 1.6374 1.0915 0.76841 0.51224
Proportion of Variance 0.4281 0.3119 0.1411 0.0627 0.03108 0.01381
Cumulative Proportion  0.4281 0.7400 0.8811 0.9438 0.97491 0.98872
                           PC7    PC8    PC9    PC10    PC11    PC12
Standard deviation     0.35867 0.2223 0.1072 0.09909 0.08123 0.05326
Proportion of Variance 0.00677 0.0026 0.0006 0.00052 0.00035 0.00015
Cumulative Proportion  0.99549 0.9981 0.9987 0.99921 0.99956 0.99971
                          PC13    PC14    PC15    PC16    PC17
Standard deviation     0.04063 0.03890 0.03293 0.02443 0.01689
Proportion of Variance 0.00009 0.00008 0.00006 0.00003 0.00002
Cumulative Proportion  0.99980 0.99988 0.99993 0.99996 0.99998
                          PC18    PC19
Standard deviation     0.01643 0.01112
Proportion of Variance 0.00001 0.00001
Cumulative Proportion  0.99999 1.00000
PC1 PC2 PC3
bio1 -0.266 -0.227 -0.182
bio10 -0.242 -0.207 -0.292
bio11 -0.280 -0.228 -0.110
bio12 -0.225 0.313 -0.036
bio13 -0.257 0.273 -0.023
bio14 -0.202 0.330 -0.026
bio15 -0.141 -0.175 0.020
bio16 -0.254 0.275 -0.033
bio17 -0.197 0.335 -0.030
bio18 -0.175 0.347 0.014
bio19 -0.276 0.219 -0.090
bio2 0.266 0.149 -0.319
bio3 0.268 0.109 -0.277
bio4 0.227 0.162 -0.310
bio5 -0.113 -0.143 -0.516
bio6 -0.292 -0.224 -0.008
bio7 0.258 0.163 -0.324
bio8 -0.098 -0.073 0.249
bio9 -0.191 -0.155 -0.385

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

A couple different ways to visualize the environmental variation. 1) Scatterplot visualizations of marginality vs axis 1 of the specialization with the labels removed (they make things indiscernable). Red = occupied e-space. Gray = Background e-space. The yellow dot indicates the mean marginality (it’s not the value that is on the lollipop plot, so don’t let that confuse you). 2) ENFA histogram visualizations of marginality and specialization axes. 3) PCA of total e-space with colors corresponding to sexual vs. asexual populations.

quartz_off_screen 
                2 

quartz_off_screen 
                2 

Trying out a repeat of the analyses with reduced environmental space. Prioritizing variables that will limit their distribution (i.e. variables that represent the extremes). After correlation analysis, we’re left with BIO6, BIO13, BIO14, BIO16

Warning in for (b in 1:raster@data@nlayers) { :
  closing unused connection 5 (/private/var/folders/vf/3z__6c_11bb7b95dtcms1m0c0000gp/T/Rtmp6hXykz/raster/r_tmp_2020-03-06_091749_61578_87059.gri)

Var1 Var2 value
bio5 bio9 0.8044233
bio11 bio9 0.7868951
bio11 bio5 0.8900737
bio6 bio9 0.7577603
bio6 bio5 0.8347273
bio6 bio11 0.9932021
bio1 bio9 0.7957997
bio1 bio5 0.9366271
bio1 bio11 0.9917017
bio1 bio6 0.9736459
bio10 bio9 0.8125594
bio10 bio5 0.9720882
bio10 bio11 0.9672682
bio10 bio6 0.9367587
bio10 bio1 0.9910415
bio12 bio19 0.9269863
bio13 bio19 0.9488991
bio13 bio12 0.9924923
bio16 bio19 0.9527998
bio16 bio12 0.9922873
bio16 bio13 0.9990530
bio18 bio19 0.8453521
bio18 bio12 0.9789417
bio18 bio13 0.9609296
bio18 bio16 0.9575710
bio14 bio19 0.8942461
bio14 bio12 0.9909216
bio14 bio13 0.9755415
bio14 bio16 0.9742782
bio14 bio18 0.9868791
bio17 bio19 0.8939912
bio17 bio12 0.9921150
bio17 bio13 0.9758882
bio17 bio16 0.9755773
bio17 bio18 0.9838595
bio17 bio14 0.9974118
bio2 bio3 0.9186390
bio2 bio4 0.8986994
bio7 bio3 0.8312469
bio7 bio4 0.9628226
bio7 bio2 0.9802946

Saving 5.97 x 3.69 in image

Repeat the analysis with the reduced data set. The background environment is 0.5 degrees, a ballpark dispersal limitation for all stick insect species in this study.

Saving 5.97 x 3.69 in image

Visualize with reduced data set

quartz_off_screen 
                2 

quartz_off_screen 
                2 

We’re also interested in seeing if asexual populations live in more unstable climatic areas relative to sexual populations.

argo_locs_asexual <- argo_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "asexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

argo_locs_sexual <- argo_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "sexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

precip_asexual_ahor <- raster::extract(precip_stability_scaled, argo_locs_asexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

precip_sexual_ahor <- raster::extract(precip_stability_scaled, argo_locs_sexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

precip_df_ahor <- bind_rows(precip_asexual_ahor, precip_sexual_ahor)

readr::write_csv(precip_df_ahor, 
                 file.path(spread_path, "ahor_precip_stability_df.csv"))

ahor_precip_stability_plot <- ggplot(data = precip_df_ahor, aes(x = reproductive_mode, y = precip_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

ahor_precip_stability_plot

ggsave(
  "ahor_precip_stability.png",
  plot = ahor_precip_stability_plot,
  device = "png",
  path = plot_path,
  dpi = "retina"
)

temp_asexual_ahor <- raster::extract(temp_stability_scaled, argo_locs_asexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

temp_sexual_ahor <- raster::extract(temp_stability_scaled, argo_locs_sexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

temp_df_ahor <- bind_rows(temp_asexual_ahor, temp_sexual_ahor)

readr::write_csv(temp_df_ahor, 
                 file.path(spread_path, "ahor_temp_stability_df.csv"))

ahor_temp_stability_plot <- ggplot(data = temp_df_ahor, aes(x = reproductive_mode, y = temp_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

ahor_temp_stability_plot

ggsave(
  "ahor_temp_stability.png",
  plot = ahor_temp_stability_plot,
  device = "png",
  path = plot_path,
  dpi = "retina"
)

overall_asexual_ahor <- raster::extract(overall_stability_scaled, argo_locs_asexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

overall_sexual_ahor <- raster::extract(overall_stability_scaled, argo_locs_sexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

overall_df_ahor <- bind_rows(overall_asexual_ahor, overall_sexual_ahor)

readr::write_csv(overall_df_ahor, 
                 file.path(spread_path, "ahor_overall_stability_df.csv"))


ahor_overall_stability_plot <- ggplot(data = overall_df_ahor, aes(x = reproductive_mode, y = overall_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

ahor_overall_stability_plot

ggsave(
  "ahor_overall_stability.png",
  plot = ahor_overall_stability_plot,
  device = "png",
  path = plot_path,
  dpi = "retina"
)

Put all output into species-specific subfolders.

Asteliaphasma

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

A couple different ways to visualize the environmental variation. 1) Scatterplot visualizations of marginality vs axis 1 of the specialization with the labels removed (they make things indiscernable). Red = occupied e-space. Gray = Background e-space. 2) ENFA histogram visualizations of marginality and specialization axes. 3) PCA of total e-space with colors corresponding to sexual vs. asexual populations.

Trying out a repeat of the analyses with reduced environmental space. Prioritizing variables that will limit their distribution (i.e. variables that represent the extremes). After correlation analysis, we’re left with BIO5, BIO6, BIO14, BIO17.

Repeat the analysis with the reduced data set.

Visualize with reduced data set

We’re also interested in seeing if asexual populations live in more unstable climatic areas relative to sexual populations.

aste_locs_asexual <- aste_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "asexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

aste_locs_sexual <- aste_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "sexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

precip_asexual_ajuc <- raster::extract(precip_stability_scaled, aste_locs_asexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

precip_sexual_ajuc <- raster::extract(precip_stability_scaled, aste_locs_sexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

precip_df_ajuc <- bind_rows(precip_asexual_ajuc, precip_sexual_ajuc)

ggplot(data = precip_df_ajuc, aes(x = reproductive_mode, y = precip_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()


temp_asexual_ajuc <- raster::extract(temp_stability_scaled, aste_locs_asexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

temp_sexual_ajuc <- raster::extract(temp_stability_scaled, aste_locs_sexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

temp_df_ajuc <- bind_rows(temp_asexual_ajuc, temp_sexual_ajuc)

ggplot(data = temp_df_ajuc, aes(x = reproductive_mode, y = temp_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

overall_asexual_ajuc <- raster::extract(overall_stability_scaled, aste_locs_asexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

overall_sexual_ajuc <- raster::extract(overall_stability_scaled, aste_locs_sexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

overall_df_ajuc <- bind_rows(overall_asexual_ajuc, overall_sexual_ajuc)

ggplot(data = overall_df_ajuc, aes(x = reproductive_mode, y = overall_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

evi_asexual_ajuc <- raster::extract(evi_stability_scaled, aste_locs_asexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

evi_sexual_ajuc <- raster::extract(evi_stability_scaled, aste_locs_sexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

evi_df_ajuc <- bind_rows(evi_asexual_ajuc, evi_sexual_ajuc)

ggplot(data = evi_df_ajuc, aes(x = reproductive_mode, y = evi_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

Annual stability

Clitarchus

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

A couple different ways to visualize the environmental variation. 1) Scatterplot visualizations of marginality vs axis 1 of the specialization with the labels removed (they make things indiscernable). Red = occupied e-space. Gray = Background e-space. 2) ENFA histogram visualizations of marginality and specialization axes. 3) PCA of total e-space with colors corresponding to sexual vs. asexual populations.

We’re also interested in seeing if asexual populations live in more unstable climatic areas relative to sexual populations. Looks like this pattern is similar to the general cross-species pattern.

clita_locs_asexual <- clita_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "asexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

clita_locs_sexual <- clita_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "sexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

precip_asexual_choo <- raster::extract(precip_stability_scaled, clita_locs_asexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

precip_sexual_choo <- raster::extract(precip_stability_scaled, clita_locs_sexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

precip_df_choo <- bind_rows(precip_asexual_choo, precip_sexual_choo)

ggplot(data = precip_df_choo, aes(x = reproductive_mode, y = precip_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()


temp_asexual_choo <- raster::extract(temp_stability_scaled, clita_locs_asexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

temp_sexual_choo <- raster::extract(temp_stability_scaled, clita_locs_sexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

temp_df_choo <- bind_rows(temp_asexual_choo, temp_sexual_choo)

ggplot(data = temp_df_choo, aes(x = reproductive_mode, y = temp_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

overall_asexual_choo <- raster::extract(overall_stability_scaled, clita_locs_asexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

overall_sexual_choo <- raster::extract(overall_stability_scaled, clita_locs_sexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

overall_df_choo <- bind_rows(overall_asexual_choo, overall_sexual_choo)

ggplot(data = overall_df_choo, aes(x = reproductive_mode, y = overall_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

evi_asexual_choo <- raster::extract(evi_stability_scaled, clita_locs_asexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

evi_sexual_choo <- raster::extract(evi_stability_scaled, clita_locs_sexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

evi_df_choo <- bind_rows(evi_asexual_choo, evi_sexual_choo)

ggplot(data = evi_df_choo, aes(x = reproductive_mode, y = evi_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

Annual stability

Niveaphasma

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

A couple different ways to visualize the environmental variation. 1) Scatterplot visualizations of marginality vs axis 1 of the specialization with the labels removed (they make things indiscernable). Red = occupied e-space. Gray = Background e-space. 2) ENFA histogram visualizations of marginality and specialization axes. 3) PCA of total e-space with colors corresponding to sexual vs. asexual populations.

We’re also interested in seeing if asexual populations live in more unstable climatic areas relative to sexual populations.

nive_locs_asexual <- nive_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "asexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

nive_locs_sexual <- nive_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(reproductive_mode == "sexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

precip_asexual_nive <- raster::extract(precip_stability_scaled, nive_locs_asexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

precip_sexual_nive <- raster::extract(precip_stability_scaled, nive_locs_sexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

precip_df_nive <- bind_rows(precip_asexual_nive, precip_sexual_nive)

ggplot(data = precip_df_nive, aes(x = reproductive_mode, y = precip_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()


temp_asexual_nive <- raster::extract(temp_stability_scaled, nive_locs_asexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

temp_sexual_nive <- raster::extract(temp_stability_scaled, nive_locs_sexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

temp_df_nive <- bind_rows(temp_asexual_nive, temp_sexual_nive)

ggplot(data = temp_df_nive, aes(x = reproductive_mode, y = temp_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

overall_asexual_nive <- raster::extract(overall_stability_scaled, nive_locs_asexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

overall_sexual_nive <- raster::extract(overall_stability_scaled, nive_locs_sexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

overall_df_nive <- bind_rows(overall_asexual_nive, overall_sexual_nive)

ggplot(data = overall_df_nive, aes(x = reproductive_mode, y = overall_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

evi_asexual_nive <- raster::extract(evi_stability_scaled, nive_locs_asexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

evi_sexual_nive <- raster::extract(evi_stability_scaled, nive_locs_sexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

evi_df_nive <- bind_rows(evi_asexual_nive, evi_sexual_nive)

ggplot(data = evi_df_nive, aes(x = reproductive_mode, y = evi_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

Annual stability

Tectarchus

Now I’m going to to environmental niche factor analysis between sexual and asexual populations within the species.

This is for Tectarchus ovobessus.

A couple different ways to visualize the environmental variation. 1) Scatterplot visualizations of marginality vs axis 1 of the specialization with the labels removed (they make things indiscernable). Red = occupied e-space. Gray = Background e-space. 2) ENFA histogram visualizations of marginality and specialization axes. 3) PCA of total e-space with colors corresponding to sexual vs. asexual populations.

We’re also interested in seeing if asexual populations live in more unstable climatic areas relative to sexual populations.

tect_ovo_locs_asexual <- tect_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(species == "ovobessus", 
         reproductive_mode == "asexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

tect_ovo_locs_sexual <- tect_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(species == "ovobessus", 
         reproductive_mode == "sexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

precip_asexual_tect_ovo <- raster::extract(precip_stability_scaled, tect_ovo_locs_asexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

precip_sexual_tect_ovo <- raster::extract(precip_stability_scaled, tect_ovo_locs_sexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

precip_df_tect_ovo <- bind_rows(precip_asexual_tect_ovo, precip_sexual_tect_ovo)

ggplot(data = precip_df_tect_ovo, aes(x = reproductive_mode, y = precip_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()


temp_asexual_tect_ovo <- raster::extract(temp_stability_scaled, tect_ovo_locs_asexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

temp_sexual_tect_ovo <- raster::extract(temp_stability_scaled, tect_ovo_locs_sexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

temp_df_tect_ovo <- bind_rows(temp_asexual_tect_ovo, temp_sexual_tect_ovo)

ggplot(data = temp_df_tect_ovo, aes(x = reproductive_mode, y = temp_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

overall_asexual_tect_ovo <- raster::extract(overall_stability_scaled, tect_ovo_locs_asexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

overall_sexual_tect_ovo <- raster::extract(overall_stability_scaled, tect_ovo_locs_sexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

overall_df_tect_ovo <- bind_rows(overall_asexual_tect_ovo, overall_sexual_tect_ovo)

ggplot(data = overall_df_tect_ovo, aes(x = reproductive_mode, y = overall_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

evi_asexual_tect_ovo <- raster::extract(evi_stability_scaled, tect_ovo_locs_asexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

evi_sexual_tect_ovo <- raster::extract(evi_stability_scaled, tect_ovo_locs_sexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

evi_df_tect_ovo <- bind_rows(evi_asexual_tect_ovo, evi_sexual_tect_ovo)

ggplot(data = evi_df_tect_ovo, aes(x = reproductive_mode, y = evi_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

Annual stability

This is an enfa for Tectarchus huttoni.

A couple different ways to visualize the environmental variation. 1) Scatterplot visualizations of marginality vs axis 1 of the specialization with the labels removed (they make things indiscernable). Red = occupied e-space. Gray = Background e-space. 2) ENFA histogram visualizations of marginality and specialization axes. 3) PCA of total e-space with colors corresponding to sexual vs. asexual populations.

tect_hutt_locs_asexual <- tect_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(species == "huttoni", 
         reproductive_mode == "asexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

tect_hutt_locs_sexual <- tect_loc %>% 
  mutate(lat_long = str_c(latitude, longitude, sep = "_")) %>% 
  filter(species == "huttoni", 
         reproductive_mode == "sexual",
         !duplicated(lat_long)) %>% 
  dplyr::select(longitude, latitude)

precip_asexual_tect_hutt <- raster::extract(precip_stability_scaled, tect_hutt_locs_asexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

precip_sexual_tect_hutt <- raster::extract(precip_stability_scaled, tect_hutt_locs_sexual) %>% 
  enframe(name = NULL, value = "precip_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

precip_df_tect_hutt <- bind_rows(precip_asexual_tect_hutt, precip_sexual_tect_hutt)

ggplot(data = precip_df_tect_hutt, aes(x = reproductive_mode, y = precip_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()


temp_asexual_tect_hutt <- raster::extract(temp_stability_scaled, tect_hutt_locs_asexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

temp_sexual_tect_hutt <- raster::extract(temp_stability_scaled, tect_hutt_locs_sexual) %>% 
  enframe(name = NULL, value = "temp_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

temp_df_tect_hutt <- bind_rows(temp_asexual_tect_hutt, temp_sexual_tect_hutt)

ggplot(data = temp_df_tect_hutt, aes(x = reproductive_mode, y = temp_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

overall_asexual_tect_hutt <- raster::extract(overall_stability_scaled, tect_hutt_locs_asexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

overall_sexual_tect_hutt <- raster::extract(overall_stability_scaled, tect_hutt_locs_sexual) %>% 
  enframe(name = NULL, value = "overall_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

overall_df_tect_hutt <- bind_rows(overall_asexual_tect_hutt, overall_sexual_tect_hutt)

ggplot(data = overall_df_tect_hutt, aes(x = reproductive_mode, y = overall_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

evi_asexual_tect_hutt <- raster::extract(evi_stability_scaled, tect_hutt_locs_asexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "asexual")

evi_sexual_tect_hutt <- raster::extract(evi_stability_scaled, tect_hutt_locs_sexual) %>% 
  enframe(name = NULL, value = "evi_stability_scaled") %>% 
  mutate(reproductive_mode = "sexual")

evi_df_tect_hutt <- bind_rows(evi_asexual_tect_hutt, evi_sexual_tect_hutt)

ggplot(data = evi_df_tect_hutt, aes(x = reproductive_mode, y = evi_stability_scaled, color = reproductive_mode)) +
  geom_boxplot(width = 0.5, color = "black", fill = "transparent") +
  geom_jitter(width = 0.2, alpha = 0.6) +
  scale_color_viridis_d(option = "magma") +
  theme_dark()

Annual stability

Tepakiphasma

Nothing. Only one locality.

Convenience scripts

These scripts aren’t crucial for reproducing this analysis, but were helpful for various reasons. Some of these have hard-coded paths and such, so no guarantees for use right out of the box.

This was a script I used to take full chelsa files, crop them to New Zealand extent, and write them to a file with my personal computer. I don’t have much memory, so unzipping to a temporary directory, then deleting the directory to free up space for the large files worked.

LS0tCnRpdGxlOiAiU3RpY2sgSW5zZWN0IENsaW1hdGUgUENBIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKU29ycnkgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMuIFRoZXkgZ3JldyBhbmQgZ3JldyBhbmQgZ3JldywgYW5kIEkgZG9uJ3Qgd2FudCB0byByZWZhY3RvciBldmVyeXRoaW5nIHRvIHJlZHVjZSB0aGUgZGVwZW5kZW5jaWVzLgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShzZikKI1JTdG9vbGJveCBoYXMgc29tZSBkZXBlbmRlbmNpZXMgbGlrZSBvcGVuTVAgdGhhdCBjYW4gYmUgZGlmZmljdWx0IHRvIGNvbXBpbGUgb24gYSBNYWMgKG5lZWRlZCBmb3IgdGhlIGRlcGVuZGVudCBwYWNrYWdlICJjYXJldCIpLiBJZiB5b3UgaGF2ZSBIaWdoIFNpZXJyYSBPUyBvciBuZXdlciwgc2VhcmNoIGZvciBpbnN0cnVjdGlvbnMgc3BlY2lmaWMgdG8geW91ciBPUy0gaXQncyBhIGxvdCBlYXNpZXIgdGhhbiBvbGRlciBPUydzLgpsaWJyYXJ5KFJTdG9vbGJveCkKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZGF0YSkKbGlicmFyeShCU0RBKQpsaWJyYXJ5KGFkZTQpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkKbGlicmFyeShhZGVoYWJpdGF0SFMpCmxpYnJhcnkoY2xpbWF0ZVN0YWJpbGl0eSkKbGlicmFyeShodG1sd2lkZ2V0cykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dzcGF0aWFsKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkobWFwdmlldykKCnJfcGF0aCA8LSBoZXJlOjpoZXJlKCJSIikKc291cmNlKGZpbGUucGF0aChyX3BhdGgsICJwbG90X2xlYWZsZXRfZnVuY3Rpb24uUiIpKSAjc291cmNlIGxvY2FsaXR5IHBsb3R0aW5nIGZ1bmN0aW9uCnNvdXJjZShmaWxlLnBhdGgocl9wYXRoLCAicGxvdF9jbGltYXRlX3BjYV9mdW5jdGlvbi5SIikpICNzb3VyY2UgcGNhIHBsb3R0aW5nIGZ1bmN0aW9uCnNvdXJjZShmaWxlLnBhdGgocl9wYXRoLCAic3BlY2llc19wY2FfZnVuY3Rpb24uUiIpKSAjc291cmNlIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgY2xpbWF0ZSBwY2EgcGVyIHNwZWNpZXMKc291cmNlKGZpbGUucGF0aChyX3BhdGgsICJtaW5fY29udmV4X3BvbHkuUiIpKSAjc291cmNlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG1pbmltdW0gY29udmV4IHBvbHlnb24gYXJvdW5kIHBvaW50cwpzb3VyY2UoZmlsZS5wYXRoKHJfcGF0aCwgImVuZmFfY2FsY19mdW5jdGlvbi5SIikpCnNvdXJjZShmaWxlLnBhdGgocl9wYXRoLCAibWFyZ2luYWxpdHlfbG9sbGlwb3BfcGxvdC5SIikpCnNvdXJjZShmaWxlLnBhdGgocl9wYXRoLCAicHJlc2VuY2VfYWJzZW5jZV9yYXN0ZXJfZnVuY3Rpb24uUiIpKQpzb3VyY2UoZmlsZS5wYXRoKHJfcGF0aCwgImNyb3BfYmFja2dyb3VuZF9lbnZfZnVuY3Rpb24uUiIpKQpzb3VyY2UoZmlsZS5wYXRoKHJfcGF0aCwgImVuZmFfaGV4X3Bsb3QuUiIpKQpzb3VyY2UoZmlsZS5wYXRoKHJfcGF0aCwgInRvdGFsX2NsaW1hdGVfcGNhX3Bsb3QuUiIpKQpzb3VyY2UoZmlsZS5wYXRoKHJfcGF0aCwgInJhc3Rlcl9jb3JyZWxhdGlvbl9mdW5jdGlvbi5SIikpCnNvdXJjZShmaWxlLnBhdGgocl9wYXRoLCAibW92ZV90b19zcGVjaWVzLlIiKSkKYGBgCgoKUmVhZCBpbiB0aGUgc3ByZWFkc2hlZXQgYW5kIHRha2UgYSBsb29rIGF0IHRoZSBkYXRhLgoKYGBge3J9CiMgZGF0YSBwYXRoCmxvY19wYXRoIDwtIGhlcmU6OmhlcmUoImRhdGEiLCAiYWxsIHNwZWNpZXMgTmV3XzYtMTQtMTkueGxzeCIpCgojIyMgcmVhZCBpbiBzcHJlYWRzaGVldApsb2MgPC0gcmVhZF94bHN4KGxvY19wYXRoKSAlPiUKICBqYW5pdG9yOjpjbGVhbl9uYW1lcygpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSBhcy5mYWN0b3IocmVwcm9kdWN0aXZlX21vZGUpKSAKCiNnZXQgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFscywgYW5kIHRoZSBzZXh1YWxpdHkgY291bnRzIHBlciBzcGVjaWVzCmNvdW50X3JlcHJvX21vZGUgPC0gbG9jICU+JSAKICBncm91cF9ieShnZW51cywgc3BlY2llcywgcmVwcm9kdWN0aXZlX21vZGUpICU+JSAKICBkcGx5cjo6Y291bnQoKSAlPiUgCiAgbXV0YXRlKGdlbnVzX3NwZWNpZXMgPSBzdHJfYyhnZW51cywgc3BlY2llcywgc2VwID0gIl8iKSwKICAgICAgICAgZ2VudXNfc3BlY2llcyA9IHN0cl9yZXBsYWNlX2FsbChnZW51c19zcGVjaWVzLCAiICIsICJfIiksCiAgICAgICAgIGdlbnVzX3NwZWNpZXMgPSBzdHJfcmVwbGFjZV9hbGwoZ2VudXNfc3BlY2llcywgIlxcLiIsICIiKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKGdlbnVzX3NwZWNpZXMgPSBmY3RfcmVvcmRlcihnZW51c19zcGVjaWVzLCBuLCBzdW0pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ2VudXNfc3BlY2llcywgeSA9IG4sIGZpbGwgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2NvbCgpICsKICBjb29yZF9mbGlwKCkgKyAKICB0aGVtZV9taW5pbWFsKCkKCmNvdW50X3JlcHJvX21vZGUKYGBgCgojIyBNYXAKUGxvdCBhIGxlYWZsZXQgbWFwIG9mIHRoZSBsb2NhbGl0aWVzLiBUaGUgbGVhZmxldCBtYXAgaXMgaW50ZXJhY3RpdmUuIFlvdSBjYW4gY2xpY2sgb24gdGhlIGxvY2FsaXRpZXMgYW5kIGEgZmxhZyB3aXRoIHNvbWUgbWV0YWRhdGEgd2lsbCBwb3AgdXAhIAoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KI21ha2UgbG9jYWxpdHkgc2hhcGUgZmlsZSBhbmQgYXNzaWduIFdHUyBjb29yZCBzeXN0ZW0KY29vcmRfcG9pbnRzIDwtIHN0X2FzX3NmKGxvYywgY29vcmRzID0gYygibG9uZ2l0dWRlIiwgImxhdGl0dWRlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgY3JzID0gNDMyNiwgYWdyID0gImNvbnN0YW50IikKCiN1c2Ugc291cmNlZCBwbG90X2xvY3NfbGVhZmxldCBzY3JpcHQgdG8gcGxvdCBsb2NhbGl0aWVzCmFsbF9wbG90IDwtIHBsb3RfbG9jc19sZWFmbGV0KGxvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCmFsbF9wbG90CgojIHNhdmUgdGhlIG1hcAppbnRlcmFjdGl2ZV9wYXRoIDwtIGhlcmU6OmhlcmUoIm91dHB1dCIsICJpbnRlcmFjdGl2ZV9wbG90cyIpCm1hcHZpZXc6Om1hcHNob3QoCiAgYWxsX3Bsb3QsCiAgdXJsID0gZmlsZS5wYXRoKGludGVyYWN0aXZlX3BhdGgsICJhbGxfc3BlY2llc19tYXAuaHRtbCIpLAogIGZpbGUgPSBmaWxlLnBhdGgoaW50ZXJhY3RpdmVfcGF0aCwgImFsbF9zcGVjaWVzX21hcC5wZGYiKQopCmBgYAoKIyMgUENBLUdlbmVyYSB7LnRhYnNldH0KCiMjIyBDbGltYXRlIERhdGEKUmVhZCBpbiB0aGUgYmlvY2xpbSBsYXllcnMgZm9yIGFuYWx5c2lzLiBJJ20gdXNpbmcgYWxsIDE5IGZvciB0aGlzIHByZWxpbWluYXJ5IGV4cGxvcmF0aW9uLiBJJ20gdXNpbmcgQ0hFTFNBIHYxLjIgZGF0YSBkb3dubG9hZGVkIGZyb20gW3RoZWlyIHdlYnNpdGVdKGh0dHA6Ly9jaGVsc2EtY2xpbWF0ZS5vcmcvZG93bmxvYWRzLykuIFBsb3R0aW5nIHRoZSBmaXJzdCB0ZW1wZXJhdHVyZSBsYXllciB0byB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YS4KYGBge3IgY2FjaGU9VFJVRX0KY2xpbV9maWxlcyA8LSBoZXJlOjpoZXJlKCJkYXRhIiwgImNsaW1hdGUiKSAlPiUgCiAgbGlzdC5maWxlcyhwYXR0ZXJuID0gIi50aWYiLCBmdWxsLm5hbWVzID0gVFJVRSkKCncgPC0gc3RhY2soY2xpbV9maWxlcykKCiNzaG9ydGVuIHRoZSBuYW1lcyBvZiB0aGUgYmlvY2xpbXMKbmFtZXModykgPC0gcGFzdGUwKAogIHN0cmluZ3I6OnN0cl9leHRyYWN0KG5hbWVzKHcpLCAiYmlvIiksIAogIHN0cmluZ3I6OnN0cl9leHRyYWN0KG5hbWVzKHcpLCAiXFxkKyQiKQogICkKCgpnZ3Bsb3QoKSArCiAgZ2dzcGF0aWFsOjpsYXllcl9zcGF0aWFsKGRhdGEgPSB3W1sxXV0pICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIpICsKICBsYWJzKGZpbGwgPSAiQW5udWFsIEF2ZyBUZW1wIChDKjEwKSIpICsKICB0aGVtZV9taW5pbWFsKCkKICAKYGBgCgoKIyMjIFBDQSBieSBsb2NhbGl0eQpUaGlzIGlzIGEgUENBIG9mIHRoZSBjbGltYXRlIGRhdGEgZXh0cmFjdGVkIGZvciBlYWNoIGxvY2FsaXR5LCByYXRoZXIgdGhhbiBhIFBDQSBvZiB0aGUgdG90YWwgY2xpbWF0ZSBzcGFjZS4gVGhpcyBnaXZlcyB1cyBhIGdlbmVyYWwgaWRlYSBvZiBkaWZmZXJlbmNlcyBpbiBlbnZpcm9ubWVudGFsIG5pY2hlLgoKUnVuIHRoZSBwY2EgYW5kIGNoZWNrIG91dCB2YXJpYWJsZSBsb2FkaW5ncyBhbmQgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZSBleHBsYWluZWQgYnkgY29tcG9uZW50cy4KCmBgYHtyIGNhY2hlPVRSVUV9CiNleHRyYWN0IGRhdGEgZnJvbSBjaGVsc2EgZm9yIGVhY2ggbG9jYWxpdHkuIE1ha2luZyB0aGlzIGludG8gYSBkYXRhIGZyYW1lIHdpdGggY29sdW1ucyBsYWJlbGVkIHNvIHRoZSByb3cgbGFiZWxpbmcgbGluZXMgdXAgYWZ0ZXIgSSByZW1vdmUgdGhlIE5Bcy4KI2V4dHJhY3QgZGF0YSBmcm9tIHdvcmxkY2xpbSBmb3IgZWFjaCBsb2NhbGl0eS4KY29vcmRzIDwtIGRhdGEuZnJhbWUobGF0aXR1ZGUgPSBsb2MkbG9uZ2l0dWRlLCBsb25naXR1ZGUgPSBsb2MkbGF0aXR1ZGUpCgpsb2NfY2xpbSA8LSBkcGx5cjo6YmluZF9jb2xzKGxvYywgcmFzdGVyOjpleHRyYWN0KHcsIGNvb3JkcywgbWV0aG9kID0gInNpbXBsZSIsIGRmID0gVFJVRSkpICU+JSAKICBkcm9wX25hKGJpbzEpICU+JSAKICBkcGx5cjo6c2VsZWN0KC1JRCkKCiNtYWtlIGEgbWF0cml4IG9mIG9ubHkgYmlvY2xpbSB2YWx1ZXMKY2xpbV9tYXQgPC0gbG9jX2NsaW1bLGdyZXAoImJpbyIsIG5hbWVzKGxvY19jbGltKSldICU+JSBhcy5tYXRyaXgoKQoKI3J1biBwY2Egb24gY2xpbWF0ZSB2YXJpYWJsZXMKY2xpbV9wY2EgPC0gcHJjb21wKGNsaW1fbWF0LCBzY2FsZSA9IFRSVUUpCnN1bW1hcnlfcGNhIDwtIHN1bW1hcnkoY2xpbV9wY2EpICNjaGVjayBvdXQgdGhlIGNvbXBvbmVudHMKCiNwbG90IHRhYmxlcwpzdW1tYXJ5X3BjYQprbml0cjo6a2FibGUocm91bmQoY2xpbV9wY2Ekcm90YXRpb25bLDE6M10sMykpICNUYWJsZSBvZiBsb2FkaW5nIHNjb3JlcyBmb3IgdGhlIGZpcnN0IDMgUENzLgoKYGBgCgpUd28gcGxvdHM6IE9uZSBwbG90IG9mIHRoZSBQQ0EgY29sb3JlZCBhY2NvcmRpbmcgdG8gZ2VudXMsIHdpdGggY29udmV4IGh1bGxzIHN1cnJvdW5kaW5nIHRoZSBnZW5lcmEuIEl0IGxvb2tzIGxpa2UgdGhpcyByZWZsZWN0cyBhIGxhdGl0dWRpbmFsIGdyYWRpZW50IGluIHRlbXBlcmF0dXJlISBZb3UgY2FuIGludGVyYWN0IHdpdGggdGhlIFBDQSBwbG90IGJ5IGNsaWNraW5nIG9uIHBvaW50cyB0byB2aWV3IGFzc29jaWF0ZWQgbWV0YWRhdGEuIFlvdSBjYW4gaXNvbGF0ZSB0aGUgZ2VudXMgeW91IHdhbnQgdG8gdmlldyBieSBkb3VibGUgY2xpY2tpbmcgdGhlIGdlbnVzIGluIHRoZSBsZWdlbmQhIFlvdSBjYW4gYWxzbyByZW1vdmUgYSBnZW51cyBieSBjbGlja2luZyBvbiBpdCBvbmNlLiBUaGVyZSdzIHNvbWUgb3RoZXIgZnVuY3Rpb25hbGl0eSB5b3UgY2FuIGV4cGxvcmUgaW4gdGhlIHRvb2xiYXIgYXQgdGhlIHRvcCBvZiB0aGUgcGxvdC4gVGhlIHNlY29uZCBwbG90IGlzIGEgUENBIGNvbG9yZWQgYWNjb3JkaW5nIHRvIHJlcHJvZHVjdGl2ZSBtb2RlLiBJdCBsb29rcyBsaWtlIGFzZXh1YWwgcG9wdWxhdGlvbnMgb2NjdXB5IHNsaWdodGx5IGxhcmdlciBuaWNoZSBzcGFjZSwgYnV0IGJvdGggcmVwcm9kdWN0aXZlIG1vZGVzIGhhdmUgYSBzaW1pbGFyIG5pY2hlIGNlbnRlci4KYGBge3Igd2FybmluZz1GQUxTRX0KI2FkZCBwY2EgcmVzdWx0cyB0byBsb2NfY2xpbSBkYXRhIGZyYW1lCmxvY19jbGltIDwtIGRhdGEuZnJhbWUobG9jX2NsaW0sIGNsaW1fcGNhJHgpCgojdXNlIHNvdXJjZWQgcGxvdF9jbGltX3BjYSBmdW5jdGlvbiB0byBwbG90IHRoZSBwY2EgcmVzdWx0cy4gYXJncyBhcmUgdGhlIGRhdGEgc2V0IHdpdGggc3BlY2llcyBuYW1lcyBhbmQgUEMgYXhpcyB2YWx1ZXMgYW5kIHRoZSBwY2Egc3VtbWFyeQphbGxfcGNhIDwtIHBsb3RfY2xpbV9wY2EobG9jX2NsaW0sIHN1bW1hcnlfcGNhLCBmYWN0b3IgPSAiZ2VudXMiKQphbGxfcGNhCgojdXNlIHNvdXJjZWQgcGxvdF9jbGltX3BjYSBmdW5jdGlvbiB0byBwbG90IHRoZSBwY2EgcmVzdWx0cy4gYXJncyBhcmUgdGhlIGRhdGEgc2V0IHdpdGggc3BlY2llcyBuYW1lcyBhbmQgUEMgYXhpcyB2YWx1ZXMgYW5kIHRoZSBwY2Egc3VtbWFyeQpyZXByb19wY2EgPC0KICBwbG90X2NsaW1fcGNhKGxvY19jbGltLCBzdW1tYXJ5X3BjYSwgZmFjdG9yID0gInJlcHJvZHVjdGl2ZV9tb2RlIikKcmVwcm9fcGNhCgoKIyBzYXZlIHRoZSBwbG90IGNvbG9yZWQgYnkgZ2VudXMKaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoCiAgYWxsX3BjYSwKICBmaWxlLnBhdGgoaW50ZXJhY3RpdmVfcGF0aCwgImFsbF9zcGVjaWVzX3BjYV9nZW51cy5odG1sIiksCiAgc2VsZmNvbnRhaW5lZCA9IFRSVUUKKQoKIyBzYXZlIHRoZSBwbG90IGNvbG9yZWQgYnkgcmVwcm9kdWN0aXZlIG1vZGUKaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoCiAgcmVwcm9fcGNhLAogIGZpbGUucGF0aChpbnRlcmFjdGl2ZV9wYXRoLCAiYWxsX3NwZWNpZXNfcGNhX3JlcHJvLmh0bWwiKSwKICBzZWxmY29udGFpbmVkID0gVFJVRQopCgpgYGAKCkV4YW1pbmluZyB3aGV0aGVyIGFzZXh1YWwgcG9wdWxhdGlvbnMgb2NjdXB5IG1vcmUgdW5zdGFibGUgY2xpbWF0ZXMgdGhhbiBzZXh1YWwgcG9wdWxhdGlvbnMuIE9ubHkgdXNpbmcgc3BlY2llcyB3aXRoIG11bHRpcGxlIHNleHVhbCBhbmQgYXNleHVhbCBwb3B1bGF0aW9ucy4gQXNleHVhbCBwb3BzIHRlbmQgdG8gb2NjdXB5IG1vcmUgc3RhYmxlIHRlbXBlcmF0dXJlIGVudmlyb25tZW50cywgYnV0IGxlc3Mgc3RhYmxlIHByZWNpcGl0YXRpb24gZW52aXJvbm1lbnRzLiBXZSdyZSBlc3RpbWF0aW5nIHN0YWJpbGl0eSB1c2luZyB0aGUgbWV0aG9kIHByZXNlbnRlZCBieSBPd2VucyBhbmQgR3VyYWxuaWNrIDIwMTktIGNsaW1hdGVTdGFiaWxpdHk6IEFOIFIgUEFDS0FHRSBUTyBFU1RJTUFURSBDTElNQVRFIFNUQUJJTElUWSBGUk9NIFRJTUUtU0xJQ0UgQ0xJTUFUT0xPR0lFUy4KCmBgYHtyIGNhY2hlPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMjIyBDcmVhdGluZyB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbiBzdGFiaWxpdHkgbGF5ZXJzCiMjIyBVc2luZyBiaW8xIChhdmVyYWdlIHRlbXApIGFuZCBiaW8xMiAoYXZlcmFnZSBwcmVjaXApCiMjIyAyLjUgYXJjbWluIHJlc29sdXRpb24sIGFscmVhZHkgY3JvcHBlZCB0byBOWiB0byBzcGVlZCB1cCBjb21wdXRhdGlvbiB0aW1lCgoKI3RpbWUgc2xpY2VzIGFyZSBjYWxjdWxhdGVkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pZHBvaW50cyBvZiB0aGUgdHdvIHRpbWUgcGVyaW9kcyB0aGUgY2xpbWF0ZSBsYXllcnMgd2VyZSBjYWxjdWxhdGVkIGZvciAoZS5nLiBtaWRwb2ludCBvZiBMSCA9ICg0LjIga2EgLSAwLjMga2EpIC8gMiArIDAuMyBrYSA9IDIuMjUsIG1pZHBvaW50IG9mIE1IID0gKDguMzI2IGthIC0gNC4yIGthKSAvIDIgKyA0LjIgPSA2LjI2My4gdGltZV9zbGljZSA9IDYuMjYzIC0gMi4yNSA9IDQuMDEzKQp0aW1lX3NsaWNlcyA8LSBjKDI1NTAsIDQwMTMsIDYwMzcsIDE1MDAsIDIwNTAsIDUxNTApCgpwcmVjaXBfcGF0aCA8LQogIGhlcmU6OmhlcmUoImRhdGEiLAogICAgICAgImNsaW1hdGUiLAogICAgICAgInBhbGVvY2xpbV9sYXRlX3BsZWlzdG9jZW5lIiwKICAgICAgICJwcmVjaXBpdGF0aW9uIikKCnByZWNpcF9kZXZpYXRpb24gPC0KICBjbGltYXRlU3RhYmlsaXR5OjpkZXZpYXRpb25UaHJvdWdoVGltZSh2YXJpYWJsZURpcmVjdG9yeSA9IHByZWNpcF9wYXRoLCB0aW1lU2xpY2VQZXJpb2QgPSB0aW1lX3NsaWNlcykKCnByZWNpcF9zdGFiaWxpdHkgPC0gKDEgLyBwcmVjaXBfZGV2aWF0aW9uKQpwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCA8LSBjbGltYXRlU3RhYmlsaXR5OjpyZXNjYWxlMHRvMShwcmVjaXBfc3RhYmlsaXR5KQoKdGVtcF9wYXRoIDwtCiAgaGVyZTo6aGVyZSgiZGF0YSIsCiAgICAgICAiY2xpbWF0ZSIsCiAgICAgICAicGFsZW9jbGltX2xhdGVfcGxlaXN0b2NlbmUiLAogICAgICAgInRlbXBlcmF0dXJlIikKCnRlbXBfZGV2aWF0aW9uIDwtCiAgY2xpbWF0ZVN0YWJpbGl0eTo6ZGV2aWF0aW9uVGhyb3VnaFRpbWUodmFyaWFibGVEaXJlY3RvcnkgPSB0ZW1wX3BhdGgsIHRpbWVTbGljZVBlcmlvZCA9IHRpbWVfc2xpY2VzKQoKdGVtcF9zdGFiaWxpdHkgPC0gKDEgLyB0ZW1wX2RldmlhdGlvbikKdGVtcF9zdGFiaWxpdHlfc2NhbGVkIDwtIGNsaW1hdGVTdGFiaWxpdHk6OnJlc2NhbGUwdG8xKHRlbXBfc3RhYmlsaXR5KQoKb3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkIDwtIHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkICogdGVtcF9zdGFiaWxpdHlfc2NhbGVkCgp0ZW1wX3N0YWJpbGl0eV9tYXAgPC0gZ2dwbG90KCkgKwogIGdnc3BhdGlhbDo6bGF5ZXJfc3BhdGlhbChkYXRhID0gdGVtcF9zdGFiaWxpdHlfc2NhbGVkKSArCiAgbGFicyh0aXRsZSA9ICJUZW1wZXJhdHVyZSBzdGFiaWxpdHkiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmEudmFsdWUgPSAidHJhbnNwYXJlbnQiKSArCiAgdGhlbWVfbWluaW1hbCgpCgpwcmVjaXBfc3RhYmlsaXR5X21hcCA8LSBnZ3Bsb3QoKSArCiAgZ2dzcGF0aWFsOjpsYXllcl9zcGF0aWFsKGRhdGEgPSBwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCkgKwogIGxhYnModGl0bGUgPSAiUHJlY2lwaXRhdGlvbiBzdGFiaWxpdHkiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmEudmFsdWUgPSAidHJhbnNwYXJlbnQiKSArCiAgdGhlbWVfbWluaW1hbCgpCgpvdmVyYWxsX3N0YWJpbGl0eV9tYXAgPC0gZ2dwbG90KCkgKwogIGdnc3BhdGlhbDo6bGF5ZXJfc3BhdGlhbChkYXRhID0gb3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkKSArCiAgbGFicyh0aXRsZSA9ICJPdmVyYWxsIHN0YWJpbGl0eSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIpICsKICB0aGVtZV9taW5pbWFsKCkKCnRlbXBfc3RhYmlsaXR5X21hcApwcmVjaXBfc3RhYmlsaXR5X21hcApvdmVyYWxsX3N0YWJpbGl0eV9tYXAKCiMgd3JpdGUgbWFwcyB0byBmaWxlCm1hcF9wYXRoIDwtIGhlcmU6OmhlcmUoIm91dHB1dCIsICJtYXBzIikKCmdnc2F2ZSgidGVtcF9zdGFiaWxpdHkucG5nIiwKICAgICAgIHBsb3QgPSB0ZW1wX3N0YWJpbGl0eV9tYXAsCiAgICAgICBkZXZpY2UgPSAicG5nIiwKICAgICAgIHBhdGggPSBtYXBfcGF0aCwKICAgICAgIGRwaSA9ICJyZXRpbmEiKQoKZ2dzYXZlKCJwcmVjaXBfc3RhYmlsaXR5LnBuZyIsCiAgICAgICBwbG90ID0gcHJlY2lwX3N0YWJpbGl0eV9tYXAsCiAgICAgICBkZXZpY2UgPSAicG5nIiwKICAgICAgIHBhdGggPSBtYXBfcGF0aCwKICAgICAgIGRwaSA9ICJyZXRpbmEiKQoKZ2dzYXZlKCJvdmVyYWxsX3N0YWJpbGl0eS5wbmciLAogICAgICAgcGxvdCA9IG92ZXJhbGxfc3RhYmlsaXR5X21hcCwKICAgICAgIGRldmljZSA9ICJwbmciLAogICAgICAgcGF0aCA9IG1hcF9wYXRoLAogICAgICAgZHBpID0gInJldGluYSIpCgpgYGAKCgoKUGxvdCBzdGFiaWxpdHkgYWNyb3NzIHNwZWNpZXMuCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBmaWx0ZXIgZm9yIHJlbGV2YW50IHNwZWNpZXMgYW5kIGFzZXh1YWwgcmVwcm9kdWN0aXZlIG1vZGUKYXNleHVhbF9sb2NzIDwtIGxvYyAlPiUKICBtdXRhdGUobGF0X2xvbmcgPSBzdHJfYyhsYXRpdHVkZSwgbG9uZ2l0dWRlKSkgJT4lCiAgZmlsdGVyKAogICAgcmVwcm9kdWN0aXZlX21vZGUgPT0gImFzZXh1YWwiLAogICAgc3BlY2llcyA9PSAiaG9ycmlkdXMiIHwKICAgICAgc3BlY2llcyA9PSAianVjdW5kdW0iIHwKICAgICAgc3BlY2llcyA9PSAiaG9va2VyaSIgfAogICAgICBzcGVjaWVzID09ICJhbm51bGF0YSIgfAogICAgICBzcGVjaWVzID09ICJvdm9iZXNzdXMiIHwKICAgICAgc3BlY2llcyA9PSAiaHV0dG9uaSIsCiAgICAhZHVwbGljYXRlZChsYXRfbG9uZykKICApICU+JQogIGRwbHlyOjpzZWxlY3QobG9uZ2l0dWRlLCBsYXRpdHVkZSkKCiMgZmlsdGVyIGZvciByZWxldmFudCBzcGVjaWVzIGFuZCBzZXh1YWwgcmVwcm9kdWN0aXZlIG1vZGUKc2V4dWFsX2xvY3MgPC0gbG9jICU+JQogIG11dGF0ZShsYXRfbG9uZyA9IHN0cl9jKGxhdGl0dWRlLCBsb25naXR1ZGUpKSAlPiUKICBmaWx0ZXIoCiAgICByZXByb2R1Y3RpdmVfbW9kZSA9PSAic2V4dWFsIiwKICAgIHNwZWNpZXMgPT0gImhvcnJpZHVzIiB8CiAgICAgIHNwZWNpZXMgPT0gImp1Y3VuZHVtIiB8CiAgICAgIHNwZWNpZXMgPT0gImhvb2tlcmkiIHwKICAgICAgc3BlY2llcyA9PSAiYW5udWxhdGEiIHwKICAgICAgc3BlY2llcyA9PSAib3ZvYmVzc3VzIiB8CiAgICAgIHNwZWNpZXMgPT0gImh1dHRvbmkiLAogICAgIWR1cGxpY2F0ZWQobGF0X2xvbmcpCiAgKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgojIGV4dHJhY3QgcHJlY2lwdGl0YXRpb24gdmFsdWVzIGFuZCBiaW5kIGludG8gYSBuZXcgZGF0YWZyYW1lCnByZWNpcF9hc2V4dWFsIDwtCiAgcmFzdGVyOjpleHRyYWN0KHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBhc2V4dWFsX2xvY3MpICU+JQogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInByZWNpcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKcHJlY2lwX3NleHVhbCA8LQogIHJhc3Rlcjo6ZXh0cmFjdChwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCwgc2V4dWFsX2xvY3MpICU+JQogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInByZWNpcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpwcmVjaXBfZGYgPC0gYmluZF9yb3dzKHByZWNpcF9hc2V4dWFsLCBwcmVjaXBfc2V4dWFsKQoKIyBwbG90IHByZWNpcGl0YXRpb24gc3RhYmlsaXR5CnByZWNpcF9zdGFiaWxpdHlfcGxvdCA8LSBnZ3Bsb3QoCiAgZGF0YSA9IHByZWNpcF9kZiwKICBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gcHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIGZpbGwgPSByZXByb2R1Y3RpdmVfbW9kZSkKKSArCiAgZ2VvbV92aW9saW4od2lkdGggPSAwLjgpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsCiAgICAgICAgICAgICAgIGNvbG9yID0gImdyYXkiLAogICAgICAgICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCnByZWNpcF9zdGFiaWxpdHlfcGxvdAoKIyBleHRyYWN0IHRlbXBlcmF0dXJlIHZhbHVlcyBhbmQgYmluZCBpbnRvIGEgbmV3IGRhdGEgZnJhbWUKdGVtcF9hc2V4dWFsIDwtCiAgcmFzdGVyOjpleHRyYWN0KHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgYXNleHVhbF9sb2NzKSAlPiUKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgp0ZW1wX3NleHVhbCA8LQogIHJhc3Rlcjo6ZXh0cmFjdCh0ZW1wX3N0YWJpbGl0eV9zY2FsZWQsIHNleHVhbF9sb2NzKSAlPiUKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCnRlbXBfZGYgPC0gYmluZF9yb3dzKHRlbXBfYXNleHVhbCwgdGVtcF9zZXh1YWwpCgojIHBsb3QgdGVtcGVyYXR1cmUgc3RhYmlsaXR5CnRlbXBfc3RhYmlsaXR5X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSB0ZW1wX2RmLAogICAgICAgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgZmlsbCA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fdmlvbGluKHdpZHRoID0gMC44KSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLAogICAgICAgICAgICAgICBjb2xvciA9ICJncmF5IiwKICAgICAgICAgICAgICAgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCgp0ZW1wX3N0YWJpbGl0eV9wbG90CgojIGV4dHJhY3Qgb3ZlcmFsbCBzdGFiaWxpdHkgdmFsdWVzIGFuZCBiaW5kIGludG8gYSBkYXRhZnJhbWUKb3ZlcmFsbF9hc2V4dWFsIDwtCiAgcmFzdGVyOjpleHRyYWN0KG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgYXNleHVhbF9sb2NzKSAlPiUKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpvdmVyYWxsX3NleHVhbCA8LQogIHJhc3Rlcjo6ZXh0cmFjdChvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIHNleHVhbF9sb2NzKSAlPiUKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCm92ZXJhbGxfZGYgPC0gYmluZF9yb3dzKG92ZXJhbGxfYXNleHVhbCwgb3ZlcmFsbF9zZXh1YWwpCgojIHBsb3Qgb3ZlcmFsbCBzdGFiaWxpdHkKb3ZlcmFsbF9zdGFiaWxpdHlfcGxvdCA8LSBnZ3Bsb3QoCiAgZGF0YSA9IG92ZXJhbGxfZGYsCiAgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgZmlsbCA9IHJlcHJvZHVjdGl2ZV9tb2RlKQopICsKICBnZW9tX3Zpb2xpbih3aWR0aCA9IDAuOCkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwKICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JheSIsCiAgICAgICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKb3ZlcmFsbF9zdGFiaWxpdHlfcGxvdAoKIyBzYXZlIHBsb3RzCnBsb3RfcGF0aCA8LSBoZXJlOjpoZXJlKCJvdXRwdXQiLCAicGxvdHMiKQpnZ3NhdmUoInRlbXBfc3RhYmlsaXR5X3Bsb3QucG5nIiwKICAgICAgIHBsb3QgPSB0ZW1wX3N0YWJpbGl0eV9wbG90LAogICAgICAgZGV2aWNlID0gInBuZyIsCiAgICAgICBwYXRoID0gcGxvdF9wYXRoLAogICAgICAgZHBpID0gInJldGluYSIpCgpnZ3NhdmUoInByZWNpcF9zdGFiaWxpdHlfcGxvdC5wbmciLAogICAgICAgcGxvdCA9IHByZWNpcF9zdGFiaWxpdHlfcGxvdCwKICAgICAgIGRldmljZSA9ICJwbmciLAogICAgICAgcGF0aCA9IHBsb3RfcGF0aCwKICAgICAgIGRwaSA9ICJyZXRpbmEiKQoKZ2dzYXZlKCJvdmVyYWxsX3N0YWJpbGl0eV9wbG90LnBuZyIsCiAgICAgICBwbG90ID0gb3ZlcmFsbF9zdGFiaWxpdHlfcGxvdCwKICAgICAgIGRldmljZSA9ICJwbmciLAogICAgICAgcGF0aCA9IHBsb3RfcGF0aCwKICAgICAgIGRwaSA9ICJyZXRpbmEiKQpgYGAKCgoKIyMgUENBLVNwZWNpZXMgey50YWJzZXR9ClRoZXNlIGFyZSBQQ0FzIG9mIGVudmlyb25tZW50YWwgc3BhY2UgZm9yIHNwZWNpZXMgd2l0aGluIGdlbmVyYS4gRWFjaCBjbGltYXRlIFBDQSBpcyBvZiBsb2NhbGl0aWVzIGZvciBhIHNpbmdsZSBnZW51cywgY29sb3JlZCBieSBzcGVjaWVzLiBJJ20gZG9pbmcgdGhpcyBldmVuIGZvciBnZW5lcmEgd2l0aCBvbmUgc3BlY2llcywgc28gaXQncyBlYXN5IHRvIHNlZSBpZiBjZXJ0YWluIGxvY2FsaXRpZXMgZ3JvdXAgdG9nZXRoZXIuIAoKIyMjIEFjYW50aG94eWxhCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojc291cmNlIGZ1bmN0aW9uIHRvIGNvbmR1Y3QgYSBQQ0Egb24gaW5kaXZpZHVhbCBzcGVjaWVzCnN1bW1hcnlfbGlzdF9hY2FuIDwtIHNwZWNpZXNfcGNhX2Z1bihsb2NfY2xpbSwgImFjYW50aG94eWxhIikKI3Bsb3QKYWNhbl9wbG90IDwtIHBsb3RfY2xpbV9wY2Eoc3VtbWFyeV9saXN0X2FjYW4kbG9jX2NsaW0sIHN1bW1hcnlfbGlzdF9hY2FuJHN1bW1hcnlfcGNhLCAicmVwcm9kdWN0aXZlX21vZGUiKQoKYWNhbl9wbG90CgojIHNhdmUgcGNhIHBsb3QKaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYWNhbl9wbG90LCBmaWxlLnBhdGgoaW50ZXJhY3RpdmVfcGF0aCwgImFjYW50aG94eWxhX3BjYS5odG1sIiksIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKYWNhbl9sb2MgPC0gbG9jICU+JSAKICBmaWx0ZXIoZ2VudXMgPT0gImFjYW50aG94eWxhIikKICAKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKYWNhbl9tYXAgPC0gcGxvdF9sb2NzX2xlYWZsZXQoYWNhbl9sb2MsICJyZXByb2R1Y3RpdmVfbW9kZSIpCgphY2FuX21hcAoKIyBzYXZlIHRoZSBtYXAKbWFwdmlldzo6bWFwc2hvdChhY2FuX21hcCwgdXJsID0gZmlsZS5wYXRoKGludGVyYWN0aXZlX3BhdGgsICJhY2FuX21hcC5odG1sIiksIGZpbGUgPSBmaWxlLnBhdGgoaW50ZXJhY3RpdmVfcGF0aCwiYWNhbl9tYXAucGRmIikpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5X2xpc3RfYWNhbiRzdW1tYXJ5X3BjYQpsb2FkaW5nc19hY2FuIDwtIHN1bW1hcnlfbGlzdF9hY2FuJHN1bW1hcnlfcGNhJHJvdGF0aW9uCmtuaXRyOjprYWJsZShyb3VuZChsb2FkaW5nc19hY2FuWywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKCiMjIyBBcmdvc2FyY2h1cwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGNvbmR1Y3QgcGNhCnN1bW1hcnlfbGlzdF9hcmdvIDwtIHNwZWNpZXNfcGNhX2Z1bihsb2NfY2xpbSwgImFyZ29zYXJjaHVzIikKCiMgcGxvdAphcmdvX3Bsb3QgPC0KICBwbG90X2NsaW1fcGNhKHN1bW1hcnlfbGlzdF9hcmdvJGxvY19jbGltLAogICAgICAgICAgICAgICAgc3VtbWFyeV9saXN0X2FyZ28kc3VtbWFyeV9wY2EsCiAgICAgICAgICAgICAgICBmYWN0b3IgPSAicmVwcm9kdWN0aXZlX21vZGUiKQphcmdvX3Bsb3QKCmh0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KGFyZ29fcGxvdCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5wYXRoKGludGVyYWN0aXZlX3BhdGgsICJhaG9yX3BjYS5odG1sIiksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKYXJnb19sb2MgPC0gbG9jICU+JQogIGZpbHRlcihnZW51cyA9PSAiYXJnb3NhcmNodXMiKQoKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKYXJnb19tYXAgPC0gcGxvdF9sb2NzX2xlYWZsZXQoYXJnb19sb2MsICJyZXByb2R1Y3RpdmVfbW9kZSIpCgphcmdvX21hcAoKbWFwdmlldzo6bWFwc2hvdCgKICBhcmdvX21hcCwKICB1cmwgPSBmaWxlLnBhdGgoaW50ZXJhY3RpdmVfcGF0aCwgImFob3JfbWFwLmh0bWwiKSwKICBmaWxlID0gZmlsZS5wYXRoKGludGVyYWN0aXZlX3BhdGgsICJhaG9yX21hcC5wZGYiKQopCgoKYGBgCgpgYGB7cn0Kc3VtbWFyeV9saXN0X2FyZ28kc3VtbWFyeV9wY2EKbG9hZGluZ3NfYXJnbyA8LSBzdW1tYXJ5X2xpc3RfYXJnbyRzdW1tYXJ5X3BjYSRyb3RhdGlvbgprbml0cjo6a2FibGUocm91bmQobG9hZGluZ3NfYXJnb1ssIDE6M10sIDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKTm93IEknbSBnb2luZyB0byB0byBlbnZpcm9ubWVudGFsIG5pY2hlIGZhY3RvciBhbmFseXNpcyBiZXR3ZWVuIHNleHVhbCBhbmQgYXNleHVhbCBwb3B1bGF0aW9ucyB3aXRoaW4gdGhlIHNwZWNpZXMuCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgY3JlYXRlIHBhdGggZm9yIHNwcmVhZHNoZWV0cwpzcHJlYWRfcGF0aCA8LSBoZXJlOjpoZXJlKCJvdXRwdXQiLCAic3ByZWFkc2hlZXRzIikKCiNnZXQgYmFja2dyb3VuZCBlbnYndCBmb3IgdGhlIHNwZWNpZXMKYWhvcl9iZ19lbnYgPC0gYmdfZW52X2Nyb3AoYXJnb19sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImhvcnJpZHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPSB3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwphaG9yX3NleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IGFyZ29fbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaG9ycmlkdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBhaG9yX2JnX2VudikKCiNlbmZhIGZvciB0aGUgYXNleHVhbCBzcGVjaWVzCmFob3JfYXNleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IGFyZ29fbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImhvcnJpZHVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gYWhvcl9iZ19lbnYpCgoKI3Bsb3QgdGhlIG1hcmdpbmFsaXR5IHNjb3JlcwphaG9yX21hcmdpbmFsaXR5IDwtIG1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gYWhvcl9zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBhaG9yX2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIkFyZ29zYXJjaHVzIGhvcnJpZHVzIikKCiMgd3JpdGUgc2NvcmVzIHRvIGNzdnMKcmVhZHI6OndyaXRlX2NzdigKICBhaG9yX2FzZXh1YWxfZW5mYSRtICU+JSBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJtYXJnaW5hbGl0eSIpLAogIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3JfYXNleHVhbF9tYXJnaW5hbGl0eV9zY29yZS5jc3YiKQopCgpyZWFkcjo6d3JpdGVfY3N2KAogIGFob3Jfc2V4dWFsX2VuZmEkbSAlPiUgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAibWFyZ2luYWxpdHkiKSwKICBmaWxlLnBhdGgoc3ByZWFkX3BhdGgsICJhaG9yX3NleHVhbF9tYXJnaW5hbGl0eV9zY29yZS5jc3YiKQopCgpnZ3NhdmUoImFob3JfbWFyZ2luYWxpdHlfbG9sbGlwb3AucG5nIiwKICAgICAgIHBsb3QgPSBhaG9yX21hcmdpbmFsaXR5LAogICAgICAgZGV2aWNlID0gInBuZyIsCiAgICAgICBwYXRoID0gcGxvdF9wYXRoLAogICAgICAgZHBpID0gInJldGluYSIpCgoKYGBgCgpBIGNvdXBsZSBkaWZmZXJlbnQgd2F5cyB0byB2aXN1YWxpemUgdGhlIGVudmlyb25tZW50YWwgdmFyaWF0aW9uLiAxKSBTY2F0dGVycGxvdCB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSB2cyBheGlzIDEgb2YgdGhlIHNwZWNpYWxpemF0aW9uIHdpdGggdGhlIGxhYmVscyByZW1vdmVkICh0aGV5IG1ha2UgdGhpbmdzIGluZGlzY2VybmFibGUpLiBSZWQgPSBvY2N1cGllZCBlLXNwYWNlLiBHcmF5ID0gQmFja2dyb3VuZCBlLXNwYWNlLiBUaGUgeWVsbG93IGRvdCBpbmRpY2F0ZXMgdGhlIG1lYW4gbWFyZ2luYWxpdHkgKGl0J3Mgbm90IHRoZSB2YWx1ZSB0aGF0IGlzIG9uIHRoZSBsb2xsaXBvcCBwbG90LCBzbyBkb24ndCBsZXQgdGhhdCBjb25mdXNlIHlvdSkuIDIpIEVORkEgaGlzdG9ncmFtIHZpc3VhbGl6YXRpb25zIG9mIG1hcmdpbmFsaXR5IGFuZCBzcGVjaWFsaXphdGlvbiBheGVzLiAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZSB3aXRoIGNvbG9ycyBjb3JyZXNwb25kaW5nIHRvIHNleHVhbCB2cy4gYXNleHVhbCBwb3B1bGF0aW9ucy4gCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyMgMSkgRU5GQSBzY2F0dGVycGxvdAojYWNjZXNzIHRoZSByZWxldmFudCB2YWx1ZXMgZm9yIHBsb3R0aW5nCmFob3JfYXNleHVhbF9kZiA8LSBhaG9yX2FzZXh1YWxfZW5mYSRsaSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogIGJpbmRfY29scyhwciA9IGFob3JfYXNleHVhbF9lbmZhJHByKQoKcmVhZHI6OndyaXRlX2NzdihhaG9yX2FzZXh1YWxfZGYsIAogICAgICAgICAgICAgICAgIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3JfYXNleHVhbF9tYXJnaW5hbGl0eV9kZi5jc3YiKSkKCmFob3Jfc2V4dWFsX2RmIDwtIGFob3Jfc2V4dWFsX2VuZmEkbGkgJT4lIAogIGFzX3RpYmJsZSgpICU+JSAKICBiaW5kX2NvbHMocHIgPSBhaG9yX3NleHVhbF9lbmZhJHByKQoKcmVhZHI6OndyaXRlX2NzdihhaG9yX3NleHVhbF9kZiwgCiAgICAgICAgICAgICAgICAgZmlsZS5wYXRoKHNwcmVhZF9wYXRoLCAiYWhvcl9zZXh1YWxfbWFyZ2luYWxpdHlfZGYuY3N2IikpCgojYXNleHVhbAphaG9yX2VuZmFfc3BlY19hc2V4dWFsIDwtIGVuZmFfaGV4X3Bsb3QoYWhvcl9hc2V4dWFsX2RmLCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJBc2V4dWFsIikKCmFob3JfZW5mYV9zcGVjX2FzZXh1YWwKCmdnc2F2ZSgiYWhvcl9lbmZhX3NwZWNfYXNleHVhbC5wbmciLAogICAgICAgcGxvdCA9IGFob3JfZW5mYV9zcGVjX2FzZXh1YWwsCiAgICAgICBkZXZpY2UgPSAicG5nIiwKICAgICAgIHBhdGggPSBwbG90X3BhdGgsCiAgICAgICBkcGkgPSAicmV0aW5hIikKCiNzZXh1YWwKYWhvcl9lbmZhX3NwZWNfc2V4dWFsIDwtIGVuZmFfaGV4X3Bsb3QoYWhvcl9zZXh1YWxfZGYsIG1hcmcgPSBNYXIsIHNwZWMgPSBTcGUxLCByZXByb19tb2RlID0gIlNleHVhbCIpCgphaG9yX2VuZmFfc3BlY19zZXh1YWwKCmdnc2F2ZSgiYWhvcl9lbmZhX3NwZWNfc2V4dWFsLnBuZyIsCiAgICAgICBwbG90ID0gYWhvcl9lbmZhX3NwZWNfc2V4dWFsLAogICAgICAgZGV2aWNlID0gInBuZyIsCiAgICAgICBwYXRoID0gcGxvdF9wYXRoLAogICAgICAgZHBpID0gInJldGluYSIpCgojIyMgMikgRU5GQSBoaXN0b2dyYW0KIyMgYXNleHVhbApoaXN0KGFob3JfYXNleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIkFzZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojIHdyaXRlIHRvIGZpbGUKcG5nKGZpbGVuYW1lID0gZmlsZS5wYXRoKHBsb3RfcGF0aCwgImFob3JfYXNleHVhbF9lbmZhX2hpc3QucG5nIikpCmhpc3QoYWhvcl9hc2V4dWFsX2VuZmEpCnRpdGxlKG1haW4gPSAiQXNleHVhbCIsIGFkaiA9IDAuNywgbGluZSA9IC0xMikKZGV2Lm9mZigpCgojIyBzZXh1YWwKaGlzdChhaG9yX3NleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIlNleHVhbCIsIGFkaiA9IDAuNywgbGluZSA9IC0xMikKCiMgd3JpdGUgdG8gZmlsZQpwbmcoZmlsZW5hbWUgPSBmaWxlLnBhdGgocGxvdF9wYXRoLCAiYWhvcl9zZXh1YWxfZW5mYV9oaXN0LnBuZyIpKQpoaXN0KGFob3Jfc2V4dWFsX2VuZmEpCnRpdGxlKG1haW4gPSAiU2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQpkZXYub2ZmKCkKCiMjIyAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZQphaG9yX3RvdGFsX3BjYSA8LSB0b3RhbF9jbGltYXRlX3BjYV9wbG90KGJnX2VudiA9IGFob3JfYmdfZW52LCBsb2NzID0gYXJnb19sb2MsIGdlbnVzID0gIkFyZ29zYXJjaHVzIiwgc3BlY2llcyA9ICJob3JyaWR1cyIpCgphaG9yX3RvdGFsX3BjYQoKZ2dzYXZlKCJhaG9yX3RvdGFsX3BjYS5wbmciLAogICAgICAgcGxvdCA9IGFob3JfdG90YWxfcGNhLAogICAgICAgZGV2aWNlID0gInBuZyIsCiAgICAgICBwYXRoID0gcGxvdF9wYXRoLAogICAgICAgZHBpID0gInJldGluYSIpCmBgYAoKClRyeWluZyBvdXQgYSByZXBlYXQgb2YgdGhlIGFuYWx5c2VzIHdpdGggcmVkdWNlZCBlbnZpcm9ubWVudGFsIHNwYWNlLgpQcmlvcml0aXppbmcgdmFyaWFibGVzIHRoYXQgd2lsbCBsaW1pdCB0aGVpciBkaXN0cmlidXRpb24gKGkuZS4gdmFyaWFibGVzIHRoYXQgcmVwcmVzZW50IHRoZSBleHRyZW1lcykuIEFmdGVyIGNvcnJlbGF0aW9uIGFuYWx5c2lzLCB3ZSdyZSBsZWZ0IHdpdGggQklPNiwgQklPMTMsIEJJTzE0LCBCSU8xNgpgYGB7ciBjYWNoZT1UUlVFfQojIFBDQSBvZiBiYWNrZ3JvdW5kIGUtc3BhY2UuIFJlc3VsdGluZyBsaXN0IGlzIGEgY29ycmVsYXRpb24gaGVhdG1hcCAoY29yX2hlYXRtYXApLCBhIHRpYmJsZSBvZiB0aGUgcmFzdGVycyB3aXRoIGNvcnJlbGF0aW9uID4gdGhlIGN1dG9mZiAoZGVmYXVsdCBpcyAwLjc1KSwgYW5kIGEgdGliYmxlIG9mIGFsbCBwYWlyd2lzZSBjb3JyZWxhdGlvbnMKYWhvcl9wY2EgPC0gcmFzdGVyX2NvcnJlbGF0aW9uKHJhc3Rlcl9zdGFjayA9IGFob3JfYmdfZW52KQphaG9yX3BjYSRjb3JfaGVhdG1hcAphaG9yX3BjYSR0b3BfY29yICU+JSBrbml0cjo6a2FibGUoKQoKZ2dzYXZlKCJhaG9yX3BjYV9jb3JyLnBuZyIsCiAgICAgICBwbG90ID0gYWhvcl9wY2EkY29yX2hlYXRtYXAsCiAgICAgICBkZXZpY2UgPSAicG5nIiwKICAgICAgIHBhdGggPSBwbG90X3BhdGgsCiAgICAgICBkcGkgPSAicmV0aW5hIikKCgojIHdyaXRlIGNvcnJlbGF0aW9uIGRhdGEgZnJhbWUgdG8gZmlsZQpyZWFkcjo6d3JpdGVfY3N2KGFob3JfcGNhJHRvcF9jb3IsIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3JfdG9wX2Nvci5jc3YiKSkKYGBgCgpSZXBlYXQgdGhlIGFuYWx5c2lzIHdpdGggdGhlIHJlZHVjZWQgZGF0YSBzZXQuIFRoZSBiYWNrZ3JvdW5kIGVudmlyb25tZW50IGlzIDAuNSBkZWdyZWVzLCBhIGJhbGxwYXJrIGRpc3BlcnNhbCBsaW1pdGF0aW9uIGZvciBhbGwgc3RpY2sgaW5zZWN0IHNwZWNpZXMgaW4gdGhpcyBzdHVkeS4KYGBge3J9CndfYWhvciA8LSByYXN0ZXI6OnN1YnNldCh3LCBjKCJiaW82IiwgImJpbzEzIiwgImJpbzE0IiwgImJpbzE2IikpCgojZ2V0IGJhY2tncm91bmQgZW52J3QgZm9yIHRoZSBzcGVjaWVzCmFob3JfYmdfZW52X3N1YnNldCA8LSBiZ19lbnZfY3JvcChhcmdvX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaG9ycmlkdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHdfYWhvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IDAuNSkKCiNlbmZhIGZvciB0aGUgc2V4dWFsIHNwZWNpZXMKYWhvcl9zZXh1YWxfZW5mYV9zdWJzZXQgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXJnb19sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJob3JyaWR1cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGFob3JfYmdfZW52X3N1YnNldCkKCiNlbmZhIGZvciB0aGUgYXNleHVhbCBzcGVjaWVzCmFob3JfYXNleHVhbF9lbmZhX3N1YnNldCA8LSBlbmZhX2NhbGNfZnVuKGxvY3MgPSBhcmdvX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJob3JyaWR1cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGFob3JfYmdfZW52X3N1YnNldCkKCiMgd3JpdGUgbWFyZ2luYWxpdHkgc2NvcmVzIHRvIGNzdgpyZWFkcjo6d3JpdGVfY3N2KAogIGFob3JfYXNleHVhbF9lbmZhX3N1YnNldCRtICU+JSBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJtYXJnaW5hbGl0eSIpLAogIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3Jfc3Vic2V0X2FzZXh1YWxfbWFyZ2luYWxpdHlfc2NvcmUuY3N2IikKKQoKcmVhZHI6OndyaXRlX2NzdigKICBhaG9yX3NleHVhbF9lbmZhX3N1YnNldCRtICU+JSBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJtYXJnaW5hbGl0eSIpLAogIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3Jfc3Vic2V0X3NleHVhbF9tYXJnaW5hbGl0eV9zY29yZS5jc3YiKQopCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCmFob3Jfc3Vic2V0X21hcmdpbmFsaXR5IDwtCiAgbWFyZ2luYWxpdHlfbG9sbGlwb3AoCiAgICBzZXhfbWFyZyA9IGFob3Jfc2V4dWFsX2VuZmFfc3Vic2V0JG0sCiAgICBhc2V4X21hcmcgPSBhaG9yX2FzZXh1YWxfZW5mYV9zdWJzZXQkbSwKICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIkFyZ29zYXJjaHVzIGhvcnJpZHVzIgogICkKCmFob3Jfc3Vic2V0X21hcmdpbmFsaXR5CgpnZ3NhdmUoImFob3Jfc3Vic2V0X21hcmdpbmFsaXR5LnBuZyIsCiAgICAgICBwbG90ID0gYWhvcl9zdWJzZXRfbWFyZ2luYWxpdHksCiAgICAgICBkZXZpY2UgPSAicG5nIiwKICAgICAgIHBhdGggPSBwbG90X3BhdGgsCiAgICAgICBkcGkgPSAicmV0aW5hIikKCmBgYAoKVmlzdWFsaXplIHdpdGggcmVkdWNlZCBkYXRhIHNldApgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIyMgMSkgRU5GQSBzY2F0dGVycGxvdAojYWNjZXNzIHRoZSByZWxldmFudCB2YWx1ZXMgZm9yIHBsb3R0aW5nCmFob3JfYXNleHVhbF9kZl9zdWJzZXQgPC0gYWhvcl9hc2V4dWFsX2VuZmFfc3Vic2V0JGxpICU+JQogIGFzX3RpYmJsZSgpICU+JQogIGJpbmRfY29scyhwciA9IGFob3JfYXNleHVhbF9lbmZhX3N1YnNldCRwcikKCnJlYWRyOjp3cml0ZV9jc3YoCiAgYWhvcl9hc2V4dWFsX2RmX3N1YnNldCwKICBmaWxlLnBhdGgoc3ByZWFkX3BhdGgsICJhaG9yX3N1YnNldF9hc2V4dWFsX21hcmdpbmFsaXR5X2RmLmNzdiIpCikKCmFob3Jfc2V4dWFsX2RmX3N1YnNldCA8LSBhaG9yX3NleHVhbF9lbmZhX3N1YnNldCRsaSAlPiUKICBhc190aWJibGUoKSAlPiUKICBiaW5kX2NvbHMocHIgPSBhaG9yX3NleHVhbF9lbmZhX3N1YnNldCRwcikKCnJlYWRyOjp3cml0ZV9jc3YoCiAgYWhvcl9zZXh1YWxfZGZfc3Vic2V0LAogIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3Jfc3Vic2V0X3NleHVhbF9tYXJnaW5hbGl0eV9kZi5jc3YiKQopCgojYXNleHVhbC4gSmVzdXMgdGhlc2UgdmFyaWFibGUgbmFtZXMgYXJlIGdldHRpbmcgbG9uZwphaG9yX3N1YnNldF9lbmZhX3NwZWNfYXNleHVhbCA8LQogIGVuZmFfaGV4X3Bsb3QoCiAgICBhaG9yX2FzZXh1YWxfZGZfc3Vic2V0LAogICAgbWFyZyA9IE1hciwKICAgIHNwZWMgPSBTcGUxLAogICAgcmVwcm9fbW9kZSA9ICJBc2V4dWFsIgogICkKCmFob3Jfc3Vic2V0X2VuZmFfc3BlY19hc2V4dWFsCgpnZ3NhdmUoCiAgImFob3Jfc3Vic2V0X2VuZmFfc3BlY19hc2V4dWFsLnBuZyIsCiAgcGxvdCA9IGFob3Jfc3Vic2V0X2VuZmFfc3BlY19hc2V4dWFsLAogIGRldmljZSA9ICJwbmciLAogIHBhdGggPSBwbG90X3BhdGgsCiAgZHBpID0gInJldGluYSIKKQoKI3NleHVhbAphaG9yX3N1YnNldF9lbmZhX3NwZWNfc2V4dWFsIDwtCiAgZW5mYV9oZXhfcGxvdCgKICAgIGFob3Jfc2V4dWFsX2RmX3N1YnNldCwKICAgIG1hcmcgPSBNYXIsCiAgICBzcGVjID0gU3BlMSwKICAgIHJlcHJvX21vZGUgPSAiU2V4dWFsIgogICkKCmFob3Jfc3Vic2V0X2VuZmFfc3BlY19zZXh1YWwKCmdnc2F2ZSgKICAiYWhvcl9zdWJzZXRfZW5mYV9zcGVjX3NleHVhbC5wbmciLAogIHBsb3QgPSBhaG9yX3N1YnNldF9lbmZhX3NwZWNfc2V4dWFsLAogIGRldmljZSA9ICJwbmciLAogIHBhdGggPSBwbG90X3BhdGgsCiAgZHBpID0gInJldGluYSIKKQoKIyMjIDIpIEVORkEgaGlzdG9ncmFtCiMgYXNleHVhbApoaXN0KGFob3JfYXNleHVhbF9lbmZhX3N1YnNldCkKdGl0bGUobWFpbiA9ICJBc2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQoKcG5nKGZpbGVuYW1lID0gZmlsZS5wYXRoKHBsb3RfcGF0aCwgImFob3Jfc3Vic2V0X2FzZXh1YWxfZW5mYV9oaXN0LnBuZyIpKQpoaXN0KGFob3JfYXNleHVhbF9lbmZhX3N1YnNldCkKdGl0bGUobWFpbiA9ICJBc2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQpkZXYub2ZmKCkKCiMgc2V4dWFsCmhpc3QoYWhvcl9zZXh1YWxfZW5mYV9zdWJzZXQpCnRpdGxlKG1haW4gPSAiU2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQoKcG5nKGZpbGVuYW1lID0gZmlsZS5wYXRoKHBsb3RfcGF0aCwgImFob3Jfc3Vic2V0X3NleHVhbF9lbmZhX2hpc3QucG5nIikpCmhpc3QoYWhvcl9zZXh1YWxfZW5mYV9zdWJzZXQpCnRpdGxlKG1haW4gPSAiU2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQpkZXYub2ZmKCkKCiMjIyAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZQphaG9yX3N1YnNldF90b3RhbF9wY2EgPC0KICB0b3RhbF9jbGltYXRlX3BjYV9wbG90KAogICAgYmdfZW52ID0gYWhvcl9iZ19lbnZfc3Vic2V0LAogICAgbG9jcyA9IGFyZ29fbG9jLAogICAgZ2VudXMgPSAiQXJnb3NhcmNodXMiLAogICAgc3BlY2llcyA9ICJob3JyaWR1cyIKICApCgphaG9yX3N1YnNldF90b3RhbF9wY2EKCmdnc2F2ZSgKICAiYWhvcl9zdWJzZXRfdG90YWxfcGNhLnBuZyIsCiAgcGxvdCA9IGFob3Jfc3Vic2V0X3RvdGFsX3BjYSwKICBkZXZpY2UgPSAicG5nIiwKICBwYXRoID0gcGxvdF9wYXRoLAogIGRwaSA9ICJyZXRpbmEiCikKCiMgb3V0cHV0IG9iamVjdCBwYXRoCm9ial9wYXRoIDwtIGhlcmU6OmhlcmUoIm91dHB1dCIsICJvYmplY3RzIikKCiMgc2F2ZSBlbmZhIG9iamVjdHMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVudmlyb25tZW50LiBUaGV5IHRha2UgdXAgYSBsb3Qgb2YgbWVtb3J5LgpzYXZlUkRTKGFob3Jfc2V4dWFsX2VuZmEsIGZpbGUgPSBmaWxlLnBhdGgob2JqX3BhdGgsICJhaG9yX3NleHVhbF9lbmZhLlJEUyIpKQpybShhaG9yX3NleHVhbF9lbmZhKQoKc2F2ZVJEUyhhaG9yX2FzZXh1YWxfZW5mYSwgZmlsZSA9IGZpbGUucGF0aChvYmpfcGF0aCwgImFob3JfYXNleHVhbF9lbmZhLlJEUyIpKQpybShhaG9yX2FzZXh1YWxfZW5mYSkKCnNhdmVSRFMoYWhvcl9zZXh1YWxfZW5mYV9zdWJzZXQsCiAgICAgICAgZmlsZSA9IGZpbGUucGF0aChvYmpfcGF0aCwgImFob3Jfc3Vic2V0X3NleHVhbF9lbmZhLlJEUyIpKQpybShhaG9yX3NleHVhbF9lbmZhX3N1YnNldCkKCnNhdmVSRFMoYWhvcl9hc2V4dWFsX2VuZmFfc3Vic2V0LAogICAgICAgIGZpbGUgPSBmaWxlLnBhdGgob2JqX3BhdGgsICJhaG9yX3N1YnNldF9hc2V4dWFsX2VuZmEuUkRTIikpCnJtKGFob3JfYXNleHVhbF9lbmZhX3N1YnNldCkKYGBgCgoKV2UncmUgYWxzbyBpbnRlcmVzdGVkIGluIHNlZWluZyBpZiBhc2V4dWFsIHBvcHVsYXRpb25zIGxpdmUgaW4gbW9yZSB1bnN0YWJsZSBjbGltYXRpYyBhcmVhcyByZWxhdGl2ZSB0byBzZXh1YWwgcG9wdWxhdGlvbnMuIApgYGB7cn0KYXJnb19sb2NzX2FzZXh1YWwgPC0gYXJnb19sb2MgJT4lIAogIG11dGF0ZShsYXRfbG9uZyA9IHN0cl9jKGxhdGl0dWRlLCBsb25naXR1ZGUsIHNlcCA9ICJfIikpICU+JSAKICBmaWx0ZXIocmVwcm9kdWN0aXZlX21vZGUgPT0gImFzZXh1YWwiLAogICAgICAgICAhZHVwbGljYXRlZChsYXRfbG9uZykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgphcmdvX2xvY3Nfc2V4dWFsIDwtIGFyZ29fbG9jICU+JSAKICBtdXRhdGUobGF0X2xvbmcgPSBzdHJfYyhsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKHJlcHJvZHVjdGl2ZV9tb2RlID09ICJzZXh1YWwiLAogICAgICAgICAhZHVwbGljYXRlZChsYXRfbG9uZykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgpwcmVjaXBfYXNleHVhbF9haG9yIDwtIHJhc3Rlcjo6ZXh0cmFjdChwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCwgYXJnb19sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpwcmVjaXBfc2V4dWFsX2Fob3IgPC0gcmFzdGVyOjpleHRyYWN0KHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBhcmdvX2xvY3Nfc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAicHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpwcmVjaXBfZGZfYWhvciA8LSBiaW5kX3Jvd3MocHJlY2lwX2FzZXh1YWxfYWhvciwgcHJlY2lwX3NleHVhbF9haG9yKQoKcmVhZHI6OndyaXRlX2NzdihwcmVjaXBfZGZfYWhvciwgCiAgICAgICAgICAgICAgICAgZmlsZS5wYXRoKHNwcmVhZF9wYXRoLCAiYWhvcl9wcmVjaXBfc3RhYmlsaXR5X2RmLmNzdiIpKQoKYWhvcl9wcmVjaXBfc3RhYmlsaXR5X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBwcmVjaXBfZGZfYWhvciwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBjb2xvciA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCgphaG9yX3ByZWNpcF9zdGFiaWxpdHlfcGxvdAoKZ2dzYXZlKAogICJhaG9yX3ByZWNpcF9zdGFiaWxpdHkucG5nIiwKICBwbG90ID0gYWhvcl9wcmVjaXBfc3RhYmlsaXR5X3Bsb3QsCiAgZGV2aWNlID0gInBuZyIsCiAgcGF0aCA9IHBsb3RfcGF0aCwKICBkcGkgPSAicmV0aW5hIgopCgp0ZW1wX2FzZXh1YWxfYWhvciA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCBhcmdvX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInRlbXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgp0ZW1wX3NleHVhbF9haG9yIDwtIHJhc3Rlcjo6ZXh0cmFjdCh0ZW1wX3N0YWJpbGl0eV9zY2FsZWQsIGFyZ29fbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgp0ZW1wX2RmX2Fob3IgPC0gYmluZF9yb3dzKHRlbXBfYXNleHVhbF9haG9yLCB0ZW1wX3NleHVhbF9haG9yKQoKcmVhZHI6OndyaXRlX2Nzdih0ZW1wX2RmX2Fob3IsIAogICAgICAgICAgICAgICAgIGZpbGUucGF0aChzcHJlYWRfcGF0aCwgImFob3JfdGVtcF9zdGFiaWxpdHlfZGYuY3N2IikpCgphaG9yX3RlbXBfc3RhYmlsaXR5X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSB0ZW1wX2RmX2Fob3IsIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSB0ZW1wX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCmFob3JfdGVtcF9zdGFiaWxpdHlfcGxvdAoKZ2dzYXZlKAogICJhaG9yX3RlbXBfc3RhYmlsaXR5LnBuZyIsCiAgcGxvdCA9IGFob3JfdGVtcF9zdGFiaWxpdHlfcGxvdCwKICBkZXZpY2UgPSAicG5nIiwKICBwYXRoID0gcGxvdF9wYXRoLAogIGRwaSA9ICJyZXRpbmEiCikKCm92ZXJhbGxfYXNleHVhbF9haG9yIDwtIHJhc3Rlcjo6ZXh0cmFjdChvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIGFyZ29fbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAib3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCm92ZXJhbGxfc2V4dWFsX2Fob3IgPC0gcmFzdGVyOjpleHRyYWN0KG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgYXJnb19sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gIm92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCm92ZXJhbGxfZGZfYWhvciA8LSBiaW5kX3Jvd3Mob3ZlcmFsbF9hc2V4dWFsX2Fob3IsIG92ZXJhbGxfc2V4dWFsX2Fob3IpCgpyZWFkcjo6d3JpdGVfY3N2KG92ZXJhbGxfZGZfYWhvciwgCiAgICAgICAgICAgICAgICAgZmlsZS5wYXRoKHNwcmVhZF9wYXRoLCAiYWhvcl9vdmVyYWxsX3N0YWJpbGl0eV9kZi5jc3YiKSkKCgphaG9yX292ZXJhbGxfc3RhYmlsaXR5X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBvdmVyYWxsX2RmX2Fob3IsIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCmFob3Jfb3ZlcmFsbF9zdGFiaWxpdHlfcGxvdAoKZ2dzYXZlKAogICJhaG9yX292ZXJhbGxfc3RhYmlsaXR5LnBuZyIsCiAgcGxvdCA9IGFob3Jfb3ZlcmFsbF9zdGFiaWxpdHlfcGxvdCwKICBkZXZpY2UgPSAicG5nIiwKICBwYXRoID0gcGxvdF9wYXRoLAogIGRwaSA9ICJyZXRpbmEiCikKCmBgYAoKClB1dCBhbGwgb3V0cHV0IGludG8gc3BlY2llcy1zcGVjaWZpYyBzdWJmb2xkZXJzLgpgYGB7ciByZXN1bHRzPSJoaWRlIn0KYWhvcl9vdXRfaW50X3BhdGggPC0gZmlsZS5wYXRoKGludGVyYWN0aXZlX3BhdGgsICJhcmdvc2FyY2h1c19ob3JyaWR1cyIpCmFob3Jfb3V0X3Bsb3RfcGF0aCA8LSBmaWxlLnBhdGgocGxvdF9wYXRoLCAiYXJnb3NhcmNodXNfaG9ycmlkdXMiKQphaG9yX291dF9zcHJlYWRfcGF0aCA8LSBmaWxlLnBhdGgoc3ByZWFkX3BhdGgsICJhcmdvc2FyY2h1c19ob3JyaWR1cyIpCmFob3Jfb3V0X29ial9wYXRoIDwtIGZpbGUucGF0aChvYmpfcGF0aCwgImFyZ29zYXJjaHVzX2hvcnJpZHVzIikKCiMgbW92ZSBpbnRlcmFjdGl2ZQptb3ZlX3RvX3NwZWNpZXMoaW5fcGF0aCA9IGludGVyYWN0aXZlX3BhdGgsCiAgICAgICAgICAgICAgICBvdXRfcGF0aCA9IGFob3Jfb3V0X2ludF9wYXRoLAogICAgICAgICAgICAgICAgcGF0dGVybiA9ICJhaG9yIikKIyBtb3ZlIHBsb3RzCm1vdmVfdG9fc3BlY2llcyhpbl9wYXRoID0gcGxvdF9wYXRoLAogICAgICAgICAgICAgICAgb3V0X3BhdGggPSBhaG9yX291dF9wbG90X3BhdGgsCiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gImFob3IiKQoKIyBtb3ZlIHNwcmVhZHNoZWV0cwptb3ZlX3RvX3NwZWNpZXMoaW5fcGF0aCA9IHNwcmVhZF9wYXRoLAogICAgICAgICAgICAgICAgb3V0X3BhdGggPSBhaG9yX291dF9zcHJlYWRfcGF0aCwKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiYWhvciIpCgojIG1vdmUgb2JqZWN0cwptb3ZlX3RvX3NwZWNpZXMoaW5fcGF0aCA9IG9ial9wYXRoLAogICAgICAgICAgICAgICAgb3V0X3BhdGggPSBhaG9yX291dF9vYmpfcGF0aCwKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiYWhvciIpCmBgYAoKCgojIyMgQXN0ZWxpYXBoYXNtYQpgYGB7cn0KI3BjYQpzdW1tYXJ5X2xpc3RfYXN0ZSA8LSBzcGVjaWVzX3BjYV9mdW4obG9jX2NsaW0sICJhc3RlbGlhcGhhc21hIikKI3Bsb3QKYXN0ZV9wbG90IDwtIHBsb3RfY2xpbV9wY2Eoc3VtbWFyeV9saXN0X2FzdGUkbG9jX2NsaW0sIHN1bW1hcnlfbGlzdF9hc3RlJHN1bW1hcnlfcGNhLCBmYWN0b3IgPSAicmVwcm9kdWN0aXZlX21vZGUiKQphc3RlX3Bsb3QKCiNpZiBzZWxmY29udGFpbmVkID0gVFJVRSwgeW91IGNhbiByZW1vdmUgdGhlIGZvbGRlciB0aGF0IGdldHMgYWRkZWQgYWxvbmdzaWRlIHRoZSBwbG90LiAKaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXN0ZV9wbG90LCBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FzdGVsaWFwaGFzbWFfcGNhLmh0bWwiKSwgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCgojZmlsdGVyIGxvY2FsaXRpZXMgZm9yIHRoZSBmb2NhbCBnZW51cwphc3RlX2xvYyA8LSBsb2MgJT4lIAogIGZpbHRlcihnZW51cyA9PSAiYXN0ZWxpYXBoYXNtYSIpCiAgCiN1c2Ugc291cmNlZCBwbG90X2xvY3NfbGVhZmxldCBzY3JpcHQgdG8gcGxvdCBsb2NhbGl0aWVzCmFzdGVfbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KGFzdGVfbG9jLCAicmVwcm9kdWN0aXZlX21vZGUiKQoKYXN0ZV9tYXAKCiNpbiBjYXNlIEkgd2FudCB0byBzYXZlIHRoZSBtYXAgc29tZXdoZXJlCiNtYXB2aWV3OjptYXBzaG90KGFzdGVfbWFwLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2FzdGVfbWFwLmh0bWwiKSwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvYXN0ZV9tYXAucGRmIikpCgpgYGAKCgoKYGBge3J9CnN1bW1hcnlfbGlzdF9hc3RlJHN1bW1hcnlfcGNhCmxvYWRpbmdzX2FzdGUgPC0gc3VtbWFyeV9saXN0X2FzdGUkc3VtbWFyeV9wY2Ekcm90YXRpb24Ka25pdHI6OmthYmxlKHJvdW5kKGxvYWRpbmdzX2FzdGVbLDE6M10sMykpICNUYWJsZSBvZiBsb2FkaW5nIHNjb3JlcyBmb3IgdGhlIGZpcnN0IDMgUENzLiAKYGBgCgoKCk5vdyBJJ20gZ29pbmcgdG8gdG8gZW52aXJvbm1lbnRhbCBuaWNoZSBmYWN0b3IgYW5hbHlzaXMgYmV0d2VlbiBzZXh1YWwgYW5kIGFzZXh1YWwgcG9wdWxhdGlvbnMgd2l0aGluIHRoZSBzcGVjaWVzLgpgYGB7cn0KI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwphanVjX2JnX2VudiA8LSBiZ19lbnZfY3JvcChhc3RlX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAianVjdW5kdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAwLjUpCgojZW5mYSBmb3IgdGhlIHNleHVhbCBzcGVjaWVzCmFqdWNfc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXN0ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJqdWN1bmR1bSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IGFqdWNfYmdfZW52KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKYWp1Y19hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gYXN0ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAianVjdW5kdW0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBhanVjX2JnX2VudikKCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gYWp1Y19zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBhanVjX2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIkFzdGVsaWFwaGFzbWEganVjdW5kdW0iKQoKYGBgCgpBIGNvdXBsZSBkaWZmZXJlbnQgd2F5cyB0byB2aXN1YWxpemUgdGhlIGVudmlyb25tZW50YWwgdmFyaWF0aW9uLiAxKSBTY2F0dGVycGxvdCB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSB2cyBheGlzIDEgb2YgdGhlIHNwZWNpYWxpemF0aW9uIHdpdGggdGhlIGxhYmVscyByZW1vdmVkICh0aGV5IG1ha2UgdGhpbmdzIGluZGlzY2VybmFibGUpLiBSZWQgPSBvY2N1cGllZCBlLXNwYWNlLiBHcmF5ID0gQmFja2dyb3VuZCBlLXNwYWNlLiAyKSBFTkZBIGhpc3RvZ3JhbSB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSBhbmQgc3BlY2lhbGl6YXRpb24gYXhlcy4gMykgUENBIG9mIHRvdGFsIGUtc3BhY2Ugd2l0aCBjb2xvcnMgY29ycmVzcG9uZGluZyB0byBzZXh1YWwgdnMuIGFzZXh1YWwgcG9wdWxhdGlvbnMuIApgYGB7cn0KIyMjIDEpIEVORkEgc2NhdHRlcnBsb3QKI2FjY2VzcyB0aGUgcmVsZXZhbnQgdmFsdWVzIGZvciBwbG90dGluZwphanVjX2FzZXh1YWxfZGYgPC0gYWp1Y19hc2V4dWFsX2VuZmEkbGkgJT4lIAogIGFzX3RpYmJsZSgpICU+JSAKICBiaW5kX2NvbHMocHIgPSBhanVjX2FzZXh1YWxfZW5mYSRwcikKCgphanVjX3NleHVhbF9kZiA8LSBhanVjX3NleHVhbF9lbmZhJGxpICU+JSAKICBhc190aWJibGUoKSAlPiUgCiAgYmluZF9jb2xzKHByID0gYWp1Y19zZXh1YWxfZW5mYSRwcikKCgojYXNleHVhbAplbmZhX2hleF9wbG90KGFqdWNfYXNleHVhbF9kZiwgbWFyZyA9IE1hciwgc3BlYyA9IFNwZTEsIHJlcHJvX21vZGUgPSAiQXNleHVhbCIpCgoKI3NleHVhbAplbmZhX2hleF9wbG90KGFqdWNfc2V4dWFsX2RmLCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJTZXh1YWwiKQoKCiMjIyAyKSBFTkZBIGhpc3RvZ3JhbQojYXNleHVhbApoaXN0KGFqdWNfYXNleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIkFzZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojc2V4dWFsCmhpc3QoYWp1Y19zZXh1YWxfZW5mYSkKdGl0bGUobWFpbiA9ICJTZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojIyMgMykgUENBIG9mIHRvdGFsIGUtc3BhY2UKdG90YWxfY2xpbWF0ZV9wY2FfcGxvdChiZ19lbnYgPSBhanVjX2JnX2VudiwgbG9jcyA9IGFzdGVfbG9jLCBnZW51cyA9ICJBc3RlbGlvcGhhc21hIiwgc3BlY2llcyA9ICJqdWN1bmR1bSIpCgpgYGAKCgpUcnlpbmcgb3V0IGEgcmVwZWF0IG9mIHRoZSBhbmFseXNlcyB3aXRoIHJlZHVjZWQgZW52aXJvbm1lbnRhbCBzcGFjZS4KUHJpb3JpdGl6aW5nIHZhcmlhYmxlcyB0aGF0IHdpbGwgbGltaXQgdGhlaXIgZGlzdHJpYnV0aW9uIChpLmUuIHZhcmlhYmxlcyB0aGF0IHJlcHJlc2VudCB0aGUgZXh0cmVtZXMpLiBBZnRlciBjb3JyZWxhdGlvbiBhbmFseXNpcywgd2UncmUgbGVmdCB3aXRoIEJJTzUsIEJJTzYsIEJJTzE0LCBCSU8xNy4KYGBge3J9CiNQQ0Egb2YgYmFja2dyb3VuZCBlLXNwYWNlLiBSZXN1bHRpbmcgbGlzdCBpcyBhIGNvcnJlbGF0aW9uIGhlYXRtYXAgKGNvcl9oZWF0bWFwKSwgYSB0aWJibGUgb2YgdGhlIHJhc3RlcnMgd2l0aCBjb3JyZWxhdGlvbiA+IHRoZSBjdXRvZmYgKGRlZmF1bHQgaXMgMC43NSksIGFuZCBhIHRpYmJsZSBvZiBhbGwgcGFpcndpc2UgY29ycmVsYXRpb25zCmFqdWNfcGNhIDwtIHJhc3Rlcl9jb3JyZWxhdGlvbihyYXN0ZXJfc3RhY2sgPSBhanVjX2JnX2VudikKYWp1Y19wY2EkY29yX2hlYXRtYXAKYWp1Y19wY2EkdG9wX2NvciAlPiUga25pdHI6OmthYmxlKCkKCmBgYAoKClJlcGVhdCB0aGUgYW5hbHlzaXMgd2l0aCB0aGUgcmVkdWNlZCBkYXRhIHNldC4KYGBge3J9CndfYWp1YyA8LSByYXN0ZXI6OnN1YnNldCh3LCBjKCJiaW81IiwgImJpbzYiLCAiYmlvMTQiLCAiYmlvMTciKSkKCiNnZXQgYmFja2dyb3VuZCBlbnYndCBmb3IgdGhlIHNwZWNpZXMKYWp1Y19iZ19lbnZfc3Vic2V0IDwtIGJnX2Vudl9jcm9wKGFzdGVfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJqdWN1bmR1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gd19hanVjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwphanVjX3NleHVhbF9lbmZhX3N1YnNldCA8LSBlbmZhX2NhbGNfZnVuKGxvY3MgPSBhc3RlX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImp1Y3VuZHVtIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gYWp1Y19iZ19lbnZfc3Vic2V0KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKYWp1Y19hc2V4dWFsX2VuZmFfc3Vic2V0IDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IGFzdGVfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImp1Y3VuZHVtIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gYWp1Y19iZ19lbnZfc3Vic2V0KQoKCiNwbG90IHRoZSBtYXJnaW5hbGl0eSBzY29yZXMKbWFyZ2luYWxpdHlfbG9sbGlwb3Aoc2V4X21hcmcgPSBhanVjX3NleHVhbF9lbmZhX3N1YnNldCRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBhanVjX2FzZXh1YWxfZW5mYV9zdWJzZXQkbSwKICAgICAgICAgICAgICAgICAgICBmdWxsX3NwZWNpZXNfbmFtZSA9ICJBc3RlbGlhcGhhc21hIGp1Y3VuZHVtIikKCmBgYAoKClZpc3VhbGl6ZSB3aXRoIHJlZHVjZWQgZGF0YSBzZXQKYGBge3J9CiMjIyAxKSBFTkZBIHNjYXR0ZXJwbG90CiNhY2Nlc3MgdGhlIHJlbGV2YW50IHZhbHVlcyBmb3IgcGxvdHRpbmcKYWp1Y19hc2V4dWFsX2RmX3N1YnNldCA8LSBhanVjX2FzZXh1YWxfZW5mYV9zdWJzZXQkbGkgJT4lIAogIGFzX3RpYmJsZSgpICU+JSAKICBiaW5kX2NvbHMocHIgPSBhanVjX2FzZXh1YWxfZW5mYV9zdWJzZXQkcHIpCgoKYWp1Y19zZXh1YWxfZGZfc3Vic2V0IDwtIGFqdWNfc2V4dWFsX2VuZmFfc3Vic2V0JGxpICU+JSAKICBhc190aWJibGUoKSAlPiUgCiAgYmluZF9jb2xzKHByID0gYWp1Y19zZXh1YWxfZW5mYV9zdWJzZXQkcHIpCgoKI2FzZXh1YWwKZW5mYV9oZXhfcGxvdChhanVjX2FzZXh1YWxfZGZfc3Vic2V0LCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJBc2V4dWFsIikKCgojc2V4dWFsCmVuZmFfaGV4X3Bsb3QoYWp1Y19zZXh1YWxfZGZfc3Vic2V0LCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJTZXh1YWwiKQoKCiMjIyAyKSBFTkZBIGhpc3RvZ3JhbQojYXNleHVhbApoaXN0KGFqdWNfYXNleHVhbF9lbmZhX3N1YnNldCkKdGl0bGUobWFpbiA9ICJBc2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQoKI3NleHVhbApoaXN0KGFqdWNfc2V4dWFsX2VuZmFfc3Vic2V0KQp0aXRsZShtYWluID0gIlNleHVhbCIsIGFkaiA9IDAuNywgbGluZSA9IC0xMikKCiMjIyAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZQp0b3RhbF9jbGltYXRlX3BjYV9wbG90KGJnX2VudiA9IGFqdWNfYmdfZW52X3N1YnNldCwgbG9jcyA9IGFzdGVfbG9jLCBnZW51cyA9ICJBc3RlbGlhcGhhc21hIiwgc3BlY2llcyA9ICJqdWN1bmR1bSIpCmBgYAoKCgoKV2UncmUgYWxzbyBpbnRlcmVzdGVkIGluIHNlZWluZyBpZiBhc2V4dWFsIHBvcHVsYXRpb25zIGxpdmUgaW4gbW9yZSB1bnN0YWJsZSBjbGltYXRpYyBhcmVhcyByZWxhdGl2ZSB0byBzZXh1YWwgcG9wdWxhdGlvbnMuIApgYGB7cn0KYXN0ZV9sb2NzX2FzZXh1YWwgPC0gYXN0ZV9sb2MgJT4lIAogIG11dGF0ZShsYXRfbG9uZyA9IHN0cl9jKGxhdGl0dWRlLCBsb25naXR1ZGUsIHNlcCA9ICJfIikpICU+JSAKICBmaWx0ZXIocmVwcm9kdWN0aXZlX21vZGUgPT0gImFzZXh1YWwiLAogICAgICAgICAhZHVwbGljYXRlZChsYXRfbG9uZykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgphc3RlX2xvY3Nfc2V4dWFsIDwtIGFzdGVfbG9jICU+JSAKICBtdXRhdGUobGF0X2xvbmcgPSBzdHJfYyhsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKHJlcHJvZHVjdGl2ZV9tb2RlID09ICJzZXh1YWwiLAogICAgICAgICAhZHVwbGljYXRlZChsYXRfbG9uZykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgpwcmVjaXBfYXNleHVhbF9hanVjIDwtIHJhc3Rlcjo6ZXh0cmFjdChwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCwgYXN0ZV9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpwcmVjaXBfc2V4dWFsX2FqdWMgPC0gcmFzdGVyOjpleHRyYWN0KHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBhc3RlX2xvY3Nfc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAicHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpwcmVjaXBfZGZfYWp1YyA8LSBiaW5kX3Jvd3MocHJlY2lwX2FzZXh1YWxfYWp1YywgcHJlY2lwX3NleHVhbF9hanVjKQoKZ2dwbG90KGRhdGEgPSBwcmVjaXBfZGZfYWp1YywgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBjb2xvciA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCgoKdGVtcF9hc2V4dWFsX2FqdWMgPC0gcmFzdGVyOjpleHRyYWN0KHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgYXN0ZV9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKdGVtcF9zZXh1YWxfYWp1YyA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCBhc3RlX2xvY3Nfc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAidGVtcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiKQoKdGVtcF9kZl9hanVjIDwtIGJpbmRfcm93cyh0ZW1wX2FzZXh1YWxfYWp1YywgdGVtcF9zZXh1YWxfYWp1YykKCmdncGxvdChkYXRhID0gdGVtcF9kZl9hanVjLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gdGVtcF9zdGFiaWxpdHlfc2NhbGVkLCBjb2xvciA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCgpvdmVyYWxsX2FzZXh1YWxfYWp1YyA8LSByYXN0ZXI6OmV4dHJhY3Qob3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkLCBhc3RlX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gIm92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpvdmVyYWxsX3NleHVhbF9hanVjIDwtIHJhc3Rlcjo6ZXh0cmFjdChvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIGFzdGVfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpvdmVyYWxsX2RmX2FqdWMgPC0gYmluZF9yb3dzKG92ZXJhbGxfYXNleHVhbF9hanVjLCBvdmVyYWxsX3NleHVhbF9hanVjKQoKZ2dwbG90KGRhdGEgPSBvdmVyYWxsX2RmX2FqdWMsIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCmV2aV9hc2V4dWFsX2FqdWMgPC0gcmFzdGVyOjpleHRyYWN0KGV2aV9zdGFiaWxpdHlfc2NhbGVkLCBhc3RlX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCmV2aV9zZXh1YWxfYWp1YyA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWQsIGFzdGVfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCmV2aV9kZl9hanVjIDwtIGJpbmRfcm93cyhldmlfYXNleHVhbF9hanVjLCBldmlfc2V4dWFsX2FqdWMpCgpnZ3Bsb3QoZGF0YSA9IGV2aV9kZl9hanVjLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gZXZpX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKYGBgCgpBbm51YWwgc3RhYmlsaXR5CmBgYHtyfQpldmlfYXNleHVhbF9hanVjX2FubnVhbCA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsLCBhc3RlX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpldmlfc2V4dWFsX2FqdWNfYW5udWFsIDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwsIGFzdGVfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpldmlfZGZfYWp1Y19hbm51YWwgPC0gYmluZF9yb3dzKGV2aV9hc2V4dWFsX2FqdWNfYW5udWFsLCBldmlfc2V4dWFsX2FqdWNfYW5udWFsKQoKZ2dwbG90KGRhdGEgPSBldmlfZGZfYWp1Y19hbm51YWwsIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKYGBgCgoKIyMjIENsaXRhcmNodXMKCmBgYHtyfQpzdW1tYXJ5X2xpc3RfY2xpdGEgPC0gc3BlY2llc19wY2FfZnVuKGxvY19jbGltLCAiY2xpdGFyY2h1cyIpCmNsaXRhX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5X2xpc3RfY2xpdGEkbG9jX2NsaW0sIHN1bW1hcnlfbGlzdF9jbGl0YSRzdW1tYXJ5X3BjYSwgZmFjdG9yID0gInJlcHJvZHVjdGl2ZV9tb2RlIikKY2xpdGFfcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIAojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoY2xpdGFfcGxvdCwgcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9jbGl0YXJjaHVzX3BjYS5odG1sIiksIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKY2xpdGFfbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJjbGl0YXJjaHVzIikKICAKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKY2xpdGFfbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KGNsaXRhX2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCmNsaXRhX21hcAoKI2luIGNhc2UgSSB3YW50IHRvIHNhdmUgdGhlIG1hcCBzb21ld2hlcmUKI21hcHZpZXc6Om1hcHNob3QoY2xpdGFfbWFwLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2NsaXRhX21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL2NsaXRhX21hcC5wZGYiKSkKCmBgYAoKCmBgYHtyfQpzdW1tYXJ5X2xpc3RfY2xpdGEkc3VtbWFyeV9wY2EKbG9hZGluZ3NfY2xpdGEgPC0gc3VtbWFyeV9saXN0X2NsaXRhJHN1bW1hcnlfcGNhJHJvdGF0aW9uCmtuaXRyOjprYWJsZShyb3VuZChsb2FkaW5nc19jbGl0YVssMTozXSwzKSkgI1RhYmxlIG9mIGxvYWRpbmcgc2NvcmVzIGZvciB0aGUgZmlyc3QgMyBQQ3MuIApgYGAKCgpOb3cgSSdtIGdvaW5nIHRvIHRvIGVudmlyb25tZW50YWwgbmljaGUgZmFjdG9yIGFuYWx5c2lzIGJldHdlZW4gc2V4dWFsIGFuZCBhc2V4dWFsIHBvcHVsYXRpb25zIHdpdGhpbiB0aGUgc3BlY2llcy4KYGBge3J9CiNnZXQgYmFja2dyb3VuZCBlbnYndCBmb3IgdGhlIHNwZWNpZXMKY2hvb19iZ19lbnYgPC0gYmdfZW52X2Nyb3AoY2xpdGFfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJob29rZXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPSB3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwpjaG9vX3NleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IGNsaXRhX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gImhvb2tlcmkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBjaG9vX2JnX2VudikKCiNlbmZhIGZvciB0aGUgYXNleHVhbCBzcGVjaWVzCmNob29fYXNleHVhbF9lbmZhIDwtIGVuZmFfY2FsY19mdW4obG9jcyA9IGNsaXRhX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJob29rZXJpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gY2hvb19iZ19lbnYpCgoKI3Bsb3QgdGhlIG1hcmdpbmFsaXR5IHNjb3JlcwptYXJnaW5hbGl0eV9sb2xsaXBvcChzZXhfbWFyZyA9IGNob29fc2V4dWFsX2VuZmEkbSwgCiAgICAgICAgICAgICAgICAgICAgYXNleF9tYXJnID0gY2hvb19hc2V4dWFsX2VuZmEkbSwKICAgICAgICAgICAgICAgICAgICBmdWxsX3NwZWNpZXNfbmFtZSA9ICJDbGl0YXJjaHVzIGhvb2tlcmkiKQoKYGBgCgpBIGNvdXBsZSBkaWZmZXJlbnQgd2F5cyB0byB2aXN1YWxpemUgdGhlIGVudmlyb25tZW50YWwgdmFyaWF0aW9uLiAxKSBTY2F0dGVycGxvdCB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSB2cyBheGlzIDEgb2YgdGhlIHNwZWNpYWxpemF0aW9uIHdpdGggdGhlIGxhYmVscyByZW1vdmVkICh0aGV5IG1ha2UgdGhpbmdzIGluZGlzY2VybmFibGUpLiBSZWQgPSBvY2N1cGllZCBlLXNwYWNlLiBHcmF5ID0gQmFja2dyb3VuZCBlLXNwYWNlLiAyKSBFTkZBIGhpc3RvZ3JhbSB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSBhbmQgc3BlY2lhbGl6YXRpb24gYXhlcy4gMykgUENBIG9mIHRvdGFsIGUtc3BhY2Ugd2l0aCBjb2xvcnMgY29ycmVzcG9uZGluZyB0byBzZXh1YWwgdnMuIGFzZXh1YWwgcG9wdWxhdGlvbnMuIApgYGB7cn0KIyMjIDEpIEVORkEgc2NhdHRlcnBsb3QKI2FjY2VzcyB0aGUgcmVsZXZhbnQgdmFsdWVzIGZvciBwbG90dGluZwpjaG9vX2FzZXh1YWxfZGYgPC0gY2hvb19hc2V4dWFsX2VuZmEkbGkgJT4lIAogIGFzX3RpYmJsZSgpICU+JSAKICBiaW5kX2NvbHMocHIgPSBjaG9vX2FzZXh1YWxfZW5mYSRwcikKCgpjaG9vX3NleHVhbF9kZiA8LSBjaG9vX3NleHVhbF9lbmZhJGxpICU+JSAKICBhc190aWJibGUoKSAlPiUgCiAgYmluZF9jb2xzKHByID0gY2hvb19zZXh1YWxfZW5mYSRwcikKCgojYXNleHVhbAplbmZhX2hleF9wbG90KGNob29fYXNleHVhbF9kZiwgbWFyZyA9IE1hciwgc3BlYyA9IFNwZTEsIHJlcHJvX21vZGUgPSAiQXNleHVhbCIpCgoKI3NleHVhbAplbmZhX2hleF9wbG90KGNob29fc2V4dWFsX2RmLCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJTZXh1YWwiKQoKCiMjIyAyKSBFTkZBIGhpc3RvZ3JhbQojYXNleHVhbApoaXN0KGNob29fYXNleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIkFzZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojc2V4dWFsCmhpc3QoY2hvb19zZXh1YWxfZW5mYSkKdGl0bGUobWFpbiA9ICJTZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojIyMgMykgUENBIG9mIHRvdGFsIGUtc3BhY2UKdG90YWxfY2xpbWF0ZV9wY2FfcGxvdChiZ19lbnYgPSBjaG9vX2JnX2VudiwgbG9jcyA9IGNsaXRhX2xvYywgZ2VudXMgPSAiQ2xpdGFyY2h1cyIsIHNwZWNpZXMgPSAiaG9va2VyaSIpCgpgYGAKCgpXZSdyZSBhbHNvIGludGVyZXN0ZWQgaW4gc2VlaW5nIGlmIGFzZXh1YWwgcG9wdWxhdGlvbnMgbGl2ZSBpbiBtb3JlIHVuc3RhYmxlIGNsaW1hdGljIGFyZWFzIHJlbGF0aXZlIHRvIHNleHVhbCBwb3B1bGF0aW9ucy4gTG9va3MgbGlrZSB0aGlzIHBhdHRlcm4gaXMgc2ltaWxhciB0byB0aGUgZ2VuZXJhbCBjcm9zcy1zcGVjaWVzIHBhdHRlcm4uCmBgYHtyfQpjbGl0YV9sb2NzX2FzZXh1YWwgPC0gY2xpdGFfbG9jICU+JSAKICBtdXRhdGUobGF0X2xvbmcgPSBzdHJfYyhsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKHJlcHJvZHVjdGl2ZV9tb2RlID09ICJhc2V4dWFsIiwKICAgICAgICAgIWR1cGxpY2F0ZWQobGF0X2xvbmcpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChsb25naXR1ZGUsIGxhdGl0dWRlKQoKY2xpdGFfbG9jc19zZXh1YWwgPC0gY2xpdGFfbG9jICU+JSAKICBtdXRhdGUobGF0X2xvbmcgPSBzdHJfYyhsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKHJlcHJvZHVjdGl2ZV9tb2RlID09ICJzZXh1YWwiLAogICAgICAgICAhZHVwbGljYXRlZChsYXRfbG9uZykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgpwcmVjaXBfYXNleHVhbF9jaG9vIDwtIHJhc3Rlcjo6ZXh0cmFjdChwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCwgY2xpdGFfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAicHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKcHJlY2lwX3NleHVhbF9jaG9vIDwtIHJhc3Rlcjo6ZXh0cmFjdChwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCwgY2xpdGFfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCnByZWNpcF9kZl9jaG9vIDwtIGJpbmRfcm93cyhwcmVjaXBfYXNleHVhbF9jaG9vLCBwcmVjaXBfc2V4dWFsX2Nob28pCgpnZ3Bsb3QoZGF0YSA9IHByZWNpcF9kZl9jaG9vLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gcHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCgp0ZW1wX2FzZXh1YWxfY2hvbyA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCBjbGl0YV9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKdGVtcF9zZXh1YWxfY2hvbyA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCBjbGl0YV9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInRlbXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCnRlbXBfZGZfY2hvbyA8LSBiaW5kX3Jvd3ModGVtcF9hc2V4dWFsX2Nob28sIHRlbXBfc2V4dWFsX2Nob28pCgpnZ3Bsb3QoZGF0YSA9IHRlbXBfZGZfY2hvbywgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKb3ZlcmFsbF9hc2V4dWFsX2Nob28gPC0gcmFzdGVyOjpleHRyYWN0KG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgY2xpdGFfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAib3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCm92ZXJhbGxfc2V4dWFsX2Nob28gPC0gcmFzdGVyOjpleHRyYWN0KG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgY2xpdGFfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpvdmVyYWxsX2RmX2Nob28gPC0gYmluZF9yb3dzKG92ZXJhbGxfYXNleHVhbF9jaG9vLCBvdmVyYWxsX3NleHVhbF9jaG9vKQoKZ2dwbG90KGRhdGEgPSBvdmVyYWxsX2RmX2Nob28sIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCmV2aV9hc2V4dWFsX2Nob28gPC0gcmFzdGVyOjpleHRyYWN0KGV2aV9zdGFiaWxpdHlfc2NhbGVkLCBjbGl0YV9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpldmlfc2V4dWFsX2Nob28gPC0gcmFzdGVyOjpleHRyYWN0KGV2aV9zdGFiaWxpdHlfc2NhbGVkLCBjbGl0YV9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiKQoKZXZpX2RmX2Nob28gPC0gYmluZF9yb3dzKGV2aV9hc2V4dWFsX2Nob28sIGV2aV9zZXh1YWxfY2hvbykKCmdncGxvdChkYXRhID0gZXZpX2RmX2Nob28sIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBldmlfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQpgYGAKCgpBbm51YWwgc3RhYmlsaXR5CmBgYHtyfQpldmlfYXNleHVhbF9jaG9vX2FubnVhbCA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsLCBjbGl0YV9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKZXZpX3NleHVhbF9jaG9vX2FubnVhbCA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsLCBjbGl0YV9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCmV2aV9kZl9jaG9vX2FubnVhbCA8LSBiaW5kX3Jvd3MoZXZpX2FzZXh1YWxfY2hvb19hbm51YWwsIGV2aV9zZXh1YWxfY2hvb19hbm51YWwpCgpnZ3Bsb3QoZGF0YSA9IGV2aV9kZl9jaG9vX2FubnVhbCwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IGV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQpgYGAKCiMjIyBNaWNyYXJjaHVzCmBgYHtyfQpzdW1tYXJ5X2xpc3RfbWljcmEgPC0gc3BlY2llc19wY2FfZnVuKGxvY19jbGltLCAibWljcmFyY2h1cyIpCm1pY3JhX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5X2xpc3RfbWljcmEkbG9jX2NsaW0sIHN1bW1hcnlfbGlzdF9taWNyYSRzdW1tYXJ5X3BjYSwgZmFjdG9yID0gInJlcHJvZHVjdGl2ZV9tb2RlIikKbWljcmFfcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIAojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQobWljcmFfcGxvdCwgcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9taWNyYXJjaHVzX3BjYS5odG1sIiksIHNlbGZjb250YWluZWQgPSBUUlVFKQoKI2ZpbHRlciBsb2NhbGl0aWVzIGZvciB0aGUgZm9jYWwgZ2VudXMKbWljcmFfbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJtaWNyYXJjaHVzIikKICAKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKbWljcmFfbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KG1pY3JhX2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCm1pY3JhX21hcAoKI2luIGNhc2UgSSB3YW50IHRvIHNhdmUgdGhlIG1hcCBzb21ld2hlcmUKI21hcHZpZXc6Om1hcHNob3QobWljcmFfbWFwLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL21pY3JhX21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL21pY3JhX21hcC5wZGYiKSkKYGBgCgoKYGBge3J9CnN1bW1hcnlfbGlzdF9taWNyYSRzdW1tYXJ5X3BjYQpsb2FkaW5nc19taWNyYSA8LSBzdW1tYXJ5X2xpc3RfbWljcmEkc3VtbWFyeV9wY2Ekcm90YXRpb24Ka25pdHI6OmthYmxlKHJvdW5kKGxvYWRpbmdzX21pY3JhWywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKIyMjIE5pdmVhcGhhc21hCgpgYGB7cn0Kc3VtbWFyeV9saXN0X25pdmUgPC0gc3BlY2llc19wY2FfZnVuKGxvY19jbGltLCAibml2ZWFwaGFzbWEiKQpuaXZlX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5X2xpc3Rfbml2ZSRsb2NfY2xpbSwgc3VtbWFyeV9saXN0X25pdmUkc3VtbWFyeV9wY2EsIGZhY3RvciA9ICJyZXByb2R1Y3RpdmVfbW9kZSIpCgpuaXZlX3Bsb3QKCiNpZiBzZWxmY29udGFpbmVkID0gVFJVRSwgeW91IGNhbiByZW1vdmUgdGhlIGZvbGRlciB0aGF0IGdldHMgYWRkZWQgYWxvbmdzaWRlIHRoZSBwbG90LiAKI2h0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KG5pdmVfcGxvdCwgcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9uaXZlYXBoYXNtYV9wY2EuaHRtbCIpLCBzZWxmY29udGFpbmVkID0gVFJVRSkKCiNmaWx0ZXIgbG9jYWxpdGllcyBmb3IgdGhlIGZvY2FsIGdlbnVzCm5pdmVfbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJuaXZlYXBoYXNtYSIpCiAgCiN1c2Ugc291cmNlZCBwbG90X2xvY3NfbGVhZmxldCBzY3JpcHQgdG8gcGxvdCBsb2NhbGl0aWVzCm5pdmVfbWFwIDwtIHBsb3RfbG9jc19sZWFmbGV0KG5pdmVfbG9jLCAicmVwcm9kdWN0aXZlX21vZGUiKQoKbml2ZV9tYXAKCiNpbiBjYXNlIEkgd2FudCB0byBzYXZlIHRoZSBtYXAgc29tZXdoZXJlCiNtYXB2aWV3OjptYXBzaG90KG5pdmVfbWFwLCB1cmwgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL25pdmVfbWFwLmh0bWwiKSwgZmlsZSA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvbml2ZV9tYXAucGRmIikpCgpgYGAKCmBgYHtyfQpzdW1tYXJ5X2xpc3Rfbml2ZSRzdW1tYXJ5X3BjYQpsb2FkaW5nc19uaXZlIDwtIHN1bW1hcnlfbGlzdF9uaXZlJHN1bW1hcnlfcGNhJHJvdGF0aW9uCmtuaXRyOjprYWJsZShyb3VuZChsb2FkaW5nc19uaXZlWywxOjNdLDMpKSAjVGFibGUgb2YgbG9hZGluZyBzY29yZXMgZm9yIHRoZSBmaXJzdCAzIFBDcy4gCmBgYAoKCk5vdyBJJ20gZ29pbmcgdG8gdG8gZW52aXJvbm1lbnRhbCBuaWNoZSBmYWN0b3IgYW5hbHlzaXMgYmV0d2VlbiBzZXh1YWwgYW5kIGFzZXh1YWwgcG9wdWxhdGlvbnMgd2l0aGluIHRoZSBzcGVjaWVzLgpgYGB7cn0KI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwpuaXZlX2JnX2VudiA8LSBiZ19lbnZfY3JvcChuaXZlX2xvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiYW5udWxhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IHcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAwLjUpCgojZW5mYSBmb3IgdGhlIHNleHVhbCBzcGVjaWVzCm5pdmVfc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gbml2ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJhbm51bGF0YSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IG5pdmVfYmdfZW52KQoKI2VuZmEgZm9yIHRoZSBhc2V4dWFsIHNwZWNpZXMKbml2ZV9hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gbml2ZV9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiYW5udWxhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSBuaXZlX2JnX2VudikKCgojcGxvdCB0aGUgbWFyZ2luYWxpdHkgc2NvcmVzCm1hcmdpbmFsaXR5X2xvbGxpcG9wKHNleF9tYXJnID0gbml2ZV9zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSBuaXZlX2FzZXh1YWxfZW5mYSRtLAogICAgICAgICAgICAgICAgICAgIGZ1bGxfc3BlY2llc19uYW1lID0gIk5pdmVhcGhhc21hIGFubnVsYXRhIikKCmBgYAoKCkEgY291cGxlIGRpZmZlcmVudCB3YXlzIHRvIHZpc3VhbGl6ZSB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYXRpb24uIDEpIFNjYXR0ZXJwbG90IHZpc3VhbGl6YXRpb25zIG9mIG1hcmdpbmFsaXR5IHZzIGF4aXMgMSBvZiB0aGUgc3BlY2lhbGl6YXRpb24gd2l0aCB0aGUgbGFiZWxzIHJlbW92ZWQgKHRoZXkgbWFrZSB0aGluZ3MgaW5kaXNjZXJuYWJsZSkuIFJlZCA9IG9jY3VwaWVkIGUtc3BhY2UuIEdyYXkgPSBCYWNrZ3JvdW5kIGUtc3BhY2UuIDIpIEVORkEgaGlzdG9ncmFtIHZpc3VhbGl6YXRpb25zIG9mIG1hcmdpbmFsaXR5IGFuZCBzcGVjaWFsaXphdGlvbiBheGVzLiAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZSB3aXRoIGNvbG9ycyBjb3JyZXNwb25kaW5nIHRvIHNleHVhbCB2cy4gYXNleHVhbCBwb3B1bGF0aW9ucy4gCmBgYHtyfQojIyMgMSkgRU5GQSBzY2F0dGVycGxvdAojYWNjZXNzIHRoZSByZWxldmFudCB2YWx1ZXMgZm9yIHBsb3R0aW5nCm5pdmVfYXNleHVhbF9kZiA8LSBuaXZlX2FzZXh1YWxfZW5mYSRsaSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogIGJpbmRfY29scyhwciA9IG5pdmVfYXNleHVhbF9lbmZhJHByKQoKCm5pdmVfc2V4dWFsX2RmIDwtIG5pdmVfc2V4dWFsX2VuZmEkbGkgJT4lIAogIGFzX3RpYmJsZSgpICU+JSAKICBiaW5kX2NvbHMocHIgPSBuaXZlX3NleHVhbF9lbmZhJHByKQoKCiNhc2V4dWFsCmVuZmFfaGV4X3Bsb3Qobml2ZV9hc2V4dWFsX2RmLCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJBc2V4dWFsIikKCgojc2V4dWFsCmVuZmFfaGV4X3Bsb3Qobml2ZV9zZXh1YWxfZGYsIG1hcmcgPSBNYXIsIHNwZWMgPSBTcGUxLCByZXByb19tb2RlID0gIlNleHVhbCIpCgoKIyMjIDIpIEVORkEgaGlzdG9ncmFtCiNhc2V4dWFsCmhpc3Qobml2ZV9hc2V4dWFsX2VuZmEpCnRpdGxlKG1haW4gPSAiQXNleHVhbCIsIGFkaiA9IDAuNywgbGluZSA9IC0xMikKCiNzZXh1YWwKaGlzdChuaXZlX3NleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIlNleHVhbCIsIGFkaiA9IDAuNywgbGluZSA9IC0xMikKCiMjIyAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZQp0b3RhbF9jbGltYXRlX3BjYV9wbG90KGJnX2VudiA9IG5pdmVfYmdfZW52LCBsb2NzID0gbml2ZV9sb2MsIGdlbnVzID0gIk5pdmVhcGhhc21hIiwgc3BlY2llcyA9ICJhbm51bGF0YSIpCgpgYGAKCgpXZSdyZSBhbHNvIGludGVyZXN0ZWQgaW4gc2VlaW5nIGlmIGFzZXh1YWwgcG9wdWxhdGlvbnMgbGl2ZSBpbiBtb3JlIHVuc3RhYmxlIGNsaW1hdGljIGFyZWFzIHJlbGF0aXZlIHRvIHNleHVhbCBwb3B1bGF0aW9ucy4gCmBgYHtyfQpuaXZlX2xvY3NfYXNleHVhbCA8LSBuaXZlX2xvYyAlPiUgCiAgbXV0YXRlKGxhdF9sb25nID0gc3RyX2MobGF0aXR1ZGUsIGxvbmdpdHVkZSwgc2VwID0gIl8iKSkgJT4lIAogIGZpbHRlcihyZXByb2R1Y3RpdmVfbW9kZSA9PSAiYXNleHVhbCIsCiAgICAgICAgICFkdXBsaWNhdGVkKGxhdF9sb25nKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QobG9uZ2l0dWRlLCBsYXRpdHVkZSkKCm5pdmVfbG9jc19zZXh1YWwgPC0gbml2ZV9sb2MgJT4lIAogIG11dGF0ZShsYXRfbG9uZyA9IHN0cl9jKGxhdGl0dWRlLCBsb25naXR1ZGUsIHNlcCA9ICJfIikpICU+JSAKICBmaWx0ZXIocmVwcm9kdWN0aXZlX21vZGUgPT0gInNleHVhbCIsCiAgICAgICAgICFkdXBsaWNhdGVkKGxhdF9sb25nKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QobG9uZ2l0dWRlLCBsYXRpdHVkZSkKCnByZWNpcF9hc2V4dWFsX25pdmUgPC0gcmFzdGVyOjpleHRyYWN0KHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBuaXZlX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInByZWNpcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCnByZWNpcF9zZXh1YWxfbml2ZSA8LSByYXN0ZXI6OmV4dHJhY3QocHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIG5pdmVfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCnByZWNpcF9kZl9uaXZlIDwtIGJpbmRfcm93cyhwcmVjaXBfYXNleHVhbF9uaXZlLCBwcmVjaXBfc2V4dWFsX25pdmUpCgpnZ3Bsb3QoZGF0YSA9IHByZWNpcF9kZl9uaXZlLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gcHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCgp0ZW1wX2FzZXh1YWxfbml2ZSA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCBuaXZlX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInRlbXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgp0ZW1wX3NleHVhbF9uaXZlIDwtIHJhc3Rlcjo6ZXh0cmFjdCh0ZW1wX3N0YWJpbGl0eV9zY2FsZWQsIG5pdmVfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgp0ZW1wX2RmX25pdmUgPC0gYmluZF9yb3dzKHRlbXBfYXNleHVhbF9uaXZlLCB0ZW1wX3NleHVhbF9uaXZlKQoKZ2dwbG90KGRhdGEgPSB0ZW1wX2RmX25pdmUsIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSB0ZW1wX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCm92ZXJhbGxfYXNleHVhbF9uaXZlIDwtIHJhc3Rlcjo6ZXh0cmFjdChvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIG5pdmVfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAib3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCm92ZXJhbGxfc2V4dWFsX25pdmUgPC0gcmFzdGVyOjpleHRyYWN0KG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgbml2ZV9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gIm92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCm92ZXJhbGxfZGZfbml2ZSA8LSBiaW5kX3Jvd3Mob3ZlcmFsbF9hc2V4dWFsX25pdmUsIG92ZXJhbGxfc2V4dWFsX25pdmUpCgpnZ3Bsb3QoZGF0YSA9IG92ZXJhbGxfZGZfbml2ZSwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKZXZpX2FzZXh1YWxfbml2ZSA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWQsIG5pdmVfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAiZXZpX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKZXZpX3NleHVhbF9uaXZlIDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZCwgbml2ZV9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiKQoKZXZpX2RmX25pdmUgPC0gYmluZF9yb3dzKGV2aV9hc2V4dWFsX25pdmUsIGV2aV9zZXh1YWxfbml2ZSkKCmdncGxvdChkYXRhID0gZXZpX2RmX25pdmUsIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBldmlfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKYGBgCgoKCkFubnVhbCBzdGFiaWxpdHkKYGBge3J9CmV2aV9hc2V4dWFsX25pdmVfYW5udWFsIDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwsIG5pdmVfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAiZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCmV2aV9zZXh1YWxfbml2ZV9hbm51YWwgPC0gcmFzdGVyOjpleHRyYWN0KGV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCwgbml2ZV9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCmV2aV9kZl9uaXZlX2FubnVhbCA8LSBiaW5kX3Jvd3MoZXZpX2FzZXh1YWxfbml2ZV9hbm51YWwsIGV2aV9zZXh1YWxfbml2ZV9hbm51YWwpCgpnZ3Bsb3QoZGF0YSA9IGV2aV9kZl9uaXZlX2FubnVhbCwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IGV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQpgYGAKCiMjIyBTcGlub3RlY3RhcmNodXMKCmBgYHtyfQpzdW1tYXJ5X2xpc3Rfc3BpbiA8LSBzcGVjaWVzX3BjYV9mdW4obG9jX2NsaW0sICJzcGlub3RlY3RhcmNodXMiKQpzcGluX3Bsb3QgPC0gcGxvdF9jbGltX3BjYShzdW1tYXJ5X2xpc3Rfc3BpbiRsb2NfY2xpbSwgc3VtbWFyeV9saXN0X3NwaW4kc3VtbWFyeV9wY2EsIGZhY3RvciA9ICJyZXByb2R1Y3RpdmVfbW9kZSIpCnNwaW5fcGxvdAoKI2lmIHNlbGZjb250YWluZWQgPSBUUlVFLCB5b3UgY2FuIHJlbW92ZSB0aGUgZm9sZGVyIHRoYXQgZ2V0cyBhZGRlZCBhbG9uZ3NpZGUgdGhlIHBsb3QuIAojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoc3Bpbl9wbG90LCBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL3NwaW5vdGVjdGFyY2h1c19wY2EuaHRtbCIpLCBzZWxmY29udGFpbmVkID0gVFJVRSkKCiNmaWx0ZXIgbG9jYWxpdGllcyBmb3IgdGhlIGZvY2FsIGdlbnVzCnNwaW5fbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJzcGlub3RlY3RhcmNodXMiKQogIAojdXNlIHNvdXJjZWQgcGxvdF9sb2NzX2xlYWZsZXQgc2NyaXB0IHRvIHBsb3QgbG9jYWxpdGllcwpzcGluX21hcCA8LSBwbG90X2xvY3NfbGVhZmxldChzcGluX2xvYywgInJlcHJvZHVjdGl2ZV9tb2RlIikKCnNwaW5fbWFwCgojaW4gY2FzZSBJIHdhbnQgdG8gc2F2ZSB0aGUgbWFwIHNvbWV3aGVyZQojbWFwdmlldzo6bWFwc2hvdChzcGluX21hcCwgdXJsID0gcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy9zcGluX21hcC5odG1sIiksIGZpbGUgPSBwYXN0ZTAoZ2V0d2QoKSwgIi9wbG90cy9yZXByb19tb2RlX3Bsb3RzL3NwaW5fbWFwLnBkZiIpKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeV9saXN0X3NwaW4kc3VtbWFyeV9wY2EKbG9hZGluZ3Nfc3BpbiA8LSBzdW1tYXJ5X2xpc3Rfc3BpbiRzdW1tYXJ5X3BjYSRyb3RhdGlvbgprbml0cjo6a2FibGUocm91bmQobG9hZGluZ3Nfc3BpblssMTozXSwzKSkgI1RhYmxlIG9mIGxvYWRpbmcgc2NvcmVzIGZvciB0aGUgZmlyc3QgMyBQQ3MuIApgYGAKCgojIyMgVGVjdGFyY2h1cwpgYGB7cn0Kc3VtbWFyeV9saXN0X3RlY3QgPC0gc3BlY2llc19wY2FfZnVuKGxvY19jbGltLCAidGVjdGFyY2h1cyIpCnRlY3RfcGxvdCA8LSBwbG90X2NsaW1fcGNhKHN1bW1hcnlfbGlzdF90ZWN0JGxvY19jbGltLCBzdW1tYXJ5X2xpc3RfdGVjdCRzdW1tYXJ5X3BjYSwgZmFjdG9yID0gInJlcHJvZHVjdGl2ZV9tb2RlIikKdGVjdF9wbG90CgojaWYgc2VsZmNvbnRhaW5lZCA9IFRSVUUsIHlvdSBjYW4gcmVtb3ZlIHRoZSBmb2xkZXIgdGhhdCBnZXRzIGFkZGVkIGFsb25nc2lkZSB0aGUgcGxvdC4gCiNodG1sd2lkZ2V0czo6c2F2ZVdpZGdldCh0ZWN0X3Bsb3QsIHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvdGVjdGFyY2h1c19wY2EuaHRtbCIpLCBzZWxmY29udGFpbmVkID0gVFJVRSkKCiNmaWx0ZXIgbG9jYWxpdGllcyBmb3IgdGhlIGZvY2FsIGdlbnVzCnRlY3RfbG9jIDwtIGxvYyAlPiUgCiAgZmlsdGVyKGdlbnVzID09ICJ0ZWN0YXJjaHVzIikKICAKI3VzZSBzb3VyY2VkIHBsb3RfbG9jc19sZWFmbGV0IHNjcmlwdCB0byBwbG90IGxvY2FsaXRpZXMKdGVjdF9tYXAgPC0gcGxvdF9sb2NzX2xlYWZsZXQodGVjdF9sb2MsICJyZXByb2R1Y3RpdmVfbW9kZSIpCgp0ZWN0X21hcAoKI2luIGNhc2UgSSB3YW50IHRvIHNhdmUgdGhlIG1hcCBzb21ld2hlcmUKI21hcHZpZXc6Om1hcHNob3QodGVjdF9tYXAsIHVybCA9IHBhc3RlMChnZXR3ZCgpLCAiL3Bsb3RzL3JlcHJvX21vZGVfcGxvdHMvdGVjdF9tYXAuaHRtbCIpLCBmaWxlID0gcGFzdGUwKGdldHdkKCksICIvcGxvdHMvcmVwcm9fbW9kZV9wbG90cy90ZWN0X21hcC5wZGYiKSkKYGBgCgoKYGBge3J9CnN1bW1hcnlfbGlzdF90ZWN0JHN1bW1hcnlfcGNhCmxvYWRpbmdzX3RlY3QgPC0gc3VtbWFyeV9saXN0X3RlY3Qkc3VtbWFyeV9wY2Ekcm90YXRpb24Ka25pdHI6OmthYmxlKHJvdW5kKGxvYWRpbmdzX3RlY3RbLDE6M10sMykpICNUYWJsZSBvZiBsb2FkaW5nIHNjb3JlcyBmb3IgdGhlIGZpcnN0IDMgUENzLiAKYGBgCgpOb3cgSSdtIGdvaW5nIHRvIHRvIGVudmlyb25tZW50YWwgbmljaGUgZmFjdG9yIGFuYWx5c2lzIGJldHdlZW4gc2V4dWFsIGFuZCBhc2V4dWFsIHBvcHVsYXRpb25zIHdpdGhpbiB0aGUgc3BlY2llcy4KClRoaXMgaXMgZm9yIFRlY3RhcmNodXMgb3ZvYmVzc3VzLgpgYGB7cn0KI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwp0ZWN0X292b19iZ19lbnYgPC0gYmdfZW52X2Nyb3AodGVjdF9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gIm92b2Jlc3N1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IDAuNSkKCiNlbmZhIGZvciB0aGUgc2V4dWFsIHNwZWNpZXMKdGVjdF9vdm9fc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gdGVjdF9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJvdm9iZXNzdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yYXN0ZXIgPSB0ZWN0X292b19iZ19lbnYpCgojZW5mYSBmb3IgdGhlIGFzZXh1YWwgc3BlY2llcwp0ZWN0X292b19hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gdGVjdF9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAib3ZvYmVzc3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gdGVjdF9vdm9fYmdfZW52KQoKCiNwbG90IHRoZSBtYXJnaW5hbGl0eSBzY29yZXMKbWFyZ2luYWxpdHlfbG9sbGlwb3Aoc2V4X21hcmcgPSB0ZWN0X292b19zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSB0ZWN0X292b19hc2V4dWFsX2VuZmEkbSwKICAgICAgICAgICAgICAgICAgICBmdWxsX3NwZWNpZXNfbmFtZSA9ICJUZWN0YXJjaHVzIG92b2Jlc3N1cyIpCgpgYGAKCgpBIGNvdXBsZSBkaWZmZXJlbnQgd2F5cyB0byB2aXN1YWxpemUgdGhlIGVudmlyb25tZW50YWwgdmFyaWF0aW9uLiAxKSBTY2F0dGVycGxvdCB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSB2cyBheGlzIDEgb2YgdGhlIHNwZWNpYWxpemF0aW9uIHdpdGggdGhlIGxhYmVscyByZW1vdmVkICh0aGV5IG1ha2UgdGhpbmdzIGluZGlzY2VybmFibGUpLiBSZWQgPSBvY2N1cGllZCBlLXNwYWNlLiBHcmF5ID0gQmFja2dyb3VuZCBlLXNwYWNlLiAyKSBFTkZBIGhpc3RvZ3JhbSB2aXN1YWxpemF0aW9ucyBvZiBtYXJnaW5hbGl0eSBhbmQgc3BlY2lhbGl6YXRpb24gYXhlcy4gMykgUENBIG9mIHRvdGFsIGUtc3BhY2Ugd2l0aCBjb2xvcnMgY29ycmVzcG9uZGluZyB0byBzZXh1YWwgdnMuIGFzZXh1YWwgcG9wdWxhdGlvbnMuIApgYGB7cn0KIyMjIDEpIEVORkEgc2NhdHRlcnBsb3QKI2FjY2VzcyB0aGUgcmVsZXZhbnQgdmFsdWVzIGZvciBwbG90dGluZwp0ZWN0X292b19hc2V4dWFsX2RmIDwtIHRlY3Rfb3ZvX2FzZXh1YWxfZW5mYSRsaSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogIGJpbmRfY29scyhwciA9IHRlY3Rfb3ZvX2FzZXh1YWxfZW5mYSRwcikKCgp0ZWN0X292b19zZXh1YWxfZGYgPC0gdGVjdF9vdm9fc2V4dWFsX2VuZmEkbGkgJT4lIAogIGFzX3RpYmJsZSgpICU+JSAKICBiaW5kX2NvbHMocHIgPSB0ZWN0X292b19zZXh1YWxfZW5mYSRwcikKCgojYXNleHVhbAplbmZhX2hleF9wbG90KHRlY3Rfb3ZvX2FzZXh1YWxfZGYsIG1hcmcgPSBNYXIsIHNwZWMgPSBTcGUxLCByZXByb19tb2RlID0gIkFzZXh1YWwiKQoKCiNzZXh1YWwKZW5mYV9oZXhfcGxvdCh0ZWN0X292b19zZXh1YWxfZGYsIG1hcmcgPSBNYXIsIHNwZWMgPSBTcGUxLCByZXByb19tb2RlID0gIlNleHVhbCIpCgoKIyMjIDIpIEVORkEgaGlzdG9ncmFtCiNhc2V4dWFsCmhpc3QodGVjdF9vdm9fYXNleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIkFzZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojc2V4dWFsCmhpc3QodGVjdF9vdm9fc2V4dWFsX2VuZmEpCnRpdGxlKG1haW4gPSAiU2V4dWFsIiwgYWRqID0gMC43LCBsaW5lID0gLTEyKQoKIyMjIDMpIFBDQSBvZiB0b3RhbCBlLXNwYWNlCnRvdGFsX2NsaW1hdGVfcGNhX3Bsb3QoYmdfZW52ID0gdGVjdF9vdm9fYmdfZW52LCBsb2NzID0gdGVjdF9sb2MsIGdlbnVzID0gIlRlY3RhcmNodXMiLCBzcGVjaWVzID0gIm92b2Jlc3N1cyIpCgpgYGAKCgpXZSdyZSBhbHNvIGludGVyZXN0ZWQgaW4gc2VlaW5nIGlmIGFzZXh1YWwgcG9wdWxhdGlvbnMgbGl2ZSBpbiBtb3JlIHVuc3RhYmxlIGNsaW1hdGljIGFyZWFzIHJlbGF0aXZlIHRvIHNleHVhbCBwb3B1bGF0aW9ucy4gCmBgYHtyfQp0ZWN0X292b19sb2NzX2FzZXh1YWwgPC0gdGVjdF9sb2MgJT4lIAogIG11dGF0ZShsYXRfbG9uZyA9IHN0cl9jKGxhdGl0dWRlLCBsb25naXR1ZGUsIHNlcCA9ICJfIikpICU+JSAKICBmaWx0ZXIoc3BlY2llcyA9PSAib3ZvYmVzc3VzIiwgCiAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID09ICJhc2V4dWFsIiwKICAgICAgICAgIWR1cGxpY2F0ZWQobGF0X2xvbmcpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChsb25naXR1ZGUsIGxhdGl0dWRlKQoKdGVjdF9vdm9fbG9jc19zZXh1YWwgPC0gdGVjdF9sb2MgJT4lIAogIG11dGF0ZShsYXRfbG9uZyA9IHN0cl9jKGxhdGl0dWRlLCBsb25naXR1ZGUsIHNlcCA9ICJfIikpICU+JSAKICBmaWx0ZXIoc3BlY2llcyA9PSAib3ZvYmVzc3VzIiwgCiAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID09ICJzZXh1YWwiLAogICAgICAgICAhZHVwbGljYXRlZChsYXRfbG9uZykpICU+JSAKICBkcGx5cjo6c2VsZWN0KGxvbmdpdHVkZSwgbGF0aXR1ZGUpCgpwcmVjaXBfYXNleHVhbF90ZWN0X292byA8LSByYXN0ZXI6OmV4dHJhY3QocHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIHRlY3Rfb3ZvX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInByZWNpcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCnByZWNpcF9zZXh1YWxfdGVjdF9vdm8gPC0gcmFzdGVyOjpleHRyYWN0KHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCB0ZWN0X292b19sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInByZWNpcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiKQoKcHJlY2lwX2RmX3RlY3Rfb3ZvIDwtIGJpbmRfcm93cyhwcmVjaXBfYXNleHVhbF90ZWN0X292bywgcHJlY2lwX3NleHVhbF90ZWN0X292bykKCmdncGxvdChkYXRhID0gcHJlY2lwX2RmX3RlY3Rfb3ZvLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gcHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCgp0ZW1wX2FzZXh1YWxfdGVjdF9vdm8gPC0gcmFzdGVyOjpleHRyYWN0KHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgdGVjdF9vdm9fbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAidGVtcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCnRlbXBfc2V4dWFsX3RlY3Rfb3ZvIDwtIHJhc3Rlcjo6ZXh0cmFjdCh0ZW1wX3N0YWJpbGl0eV9zY2FsZWQsIHRlY3Rfb3ZvX2xvY3Nfc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAidGVtcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiKQoKdGVtcF9kZl90ZWN0X292byA8LSBiaW5kX3Jvd3ModGVtcF9hc2V4dWFsX3RlY3Rfb3ZvLCB0ZW1wX3NleHVhbF90ZWN0X292bykKCmdncGxvdChkYXRhID0gdGVtcF9kZl90ZWN0X292bywgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKb3ZlcmFsbF9hc2V4dWFsX3RlY3Rfb3ZvIDwtIHJhc3Rlcjo6ZXh0cmFjdChvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIHRlY3Rfb3ZvX2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gIm92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpvdmVyYWxsX3NleHVhbF90ZWN0X292byA8LSByYXN0ZXI6OmV4dHJhY3Qob3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkLCB0ZWN0X292b19sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gIm92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCm92ZXJhbGxfZGZfdGVjdF9vdm8gPC0gYmluZF9yb3dzKG92ZXJhbGxfYXNleHVhbF90ZWN0X292bywgb3ZlcmFsbF9zZXh1YWxfdGVjdF9vdm8pCgpnZ3Bsb3QoZGF0YSA9IG92ZXJhbGxfZGZfdGVjdF9vdm8sIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKCmV2aV9hc2V4dWFsX3RlY3Rfb3ZvIDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZCwgdGVjdF9vdm9fbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAiZXZpX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKZXZpX3NleHVhbF90ZWN0X292byA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWQsIHRlY3Rfb3ZvX2xvY3Nfc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAiZXZpX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpldmlfZGZfdGVjdF9vdm8gPC0gYmluZF9yb3dzKGV2aV9hc2V4dWFsX3RlY3Rfb3ZvLCBldmlfc2V4dWFsX3RlY3Rfb3ZvKQoKZ2dwbG90KGRhdGEgPSBldmlfZGZfdGVjdF9vdm8sIGFlcyh4ID0gcmVwcm9kdWN0aXZlX21vZGUsIHkgPSBldmlfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQpgYGAKCkFubnVhbCBzdGFiaWxpdHkKYGBge3J9CmV2aV9hc2V4dWFsX3RlY3Rfb3ZvX2FubnVhbCA8LSByYXN0ZXI6OmV4dHJhY3QoZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsLCB0ZWN0X292b19sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKZXZpX3NleHVhbF90ZWN0X292b19hbm51YWwgPC0gcmFzdGVyOjpleHRyYWN0KGV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCwgdGVjdF9vdm9fbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpldmlfZGZfdGVjdF9vdm9fYW5udWFsIDwtIGJpbmRfcm93cyhldmlfYXNleHVhbF90ZWN0X292b19hbm51YWwsIGV2aV9zZXh1YWxfdGVjdF9vdm9fYW5udWFsKQoKZ2dwbG90KGRhdGEgPSBldmlfZGZfdGVjdF9vdm9fYW5udWFsLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsLCBjb2xvciA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCmBgYAoKVGhpcyBpcyBhbiBlbmZhIGZvciBUZWN0YXJjaHVzIGh1dHRvbmkuCmBgYHtyfQojIyNPbmx5IG5lZWQgdG8gZ2V0IGJnIGVudid0IGlmIHlvdSdyZSBub3QgcnVubmluZyB0aGUgcHJldmlvdXMgY2h1bmsKI2dldCBiYWNrZ3JvdW5kIGVudid0IGZvciB0aGUgc3BlY2llcwp0ZWN0X2h1dHRfYmdfZW52IDwtIGJnX2Vudl9jcm9wKHRlY3RfbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJodXR0b25pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgPSB3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gMC41KQoKI2VuZmEgZm9yIHRoZSBzZXh1YWwgc3BlY2llcwp0ZWN0X2h1dHRfc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gdGVjdF9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9ICJodXR0b25pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcmFzdGVyID0gdGVjdF9odXR0X2JnX2VudikKCiNlbmZhIGZvciB0aGUgYXNleHVhbCBzcGVjaWVzCnRlY3RfaHV0dF9hc2V4dWFsX2VuZmEgPC0gZW5mYV9jYWxjX2Z1bihsb2NzID0gdGVjdF9sb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiaHV0dG9uaSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jhc3RlciA9IHRlY3RfaHV0dF9iZ19lbnYpCgoKI3Bsb3QgdGhlIG1hcmdpbmFsaXR5IHNjb3JlcwptYXJnaW5hbGl0eV9sb2xsaXBvcChzZXhfbWFyZyA9IHRlY3RfaHV0dF9zZXh1YWxfZW5mYSRtLCAKICAgICAgICAgICAgICAgICAgICBhc2V4X21hcmcgPSB0ZWN0X2h1dHRfYXNleHVhbF9lbmZhJG0sCiAgICAgICAgICAgICAgICAgICAgZnVsbF9zcGVjaWVzX25hbWUgPSAiVGVjdGFyY2h1cyBodXR0b25pIikKCmBgYAoKQSBjb3VwbGUgZGlmZmVyZW50IHdheXMgdG8gdmlzdWFsaXplIHRoZSBlbnZpcm9ubWVudGFsIHZhcmlhdGlvbi4gMSkgU2NhdHRlcnBsb3QgdmlzdWFsaXphdGlvbnMgb2YgbWFyZ2luYWxpdHkgdnMgYXhpcyAxIG9mIHRoZSBzcGVjaWFsaXphdGlvbiB3aXRoIHRoZSBsYWJlbHMgcmVtb3ZlZCAodGhleSBtYWtlIHRoaW5ncyBpbmRpc2Nlcm5hYmxlKS4gUmVkID0gb2NjdXBpZWQgZS1zcGFjZS4gR3JheSA9IEJhY2tncm91bmQgZS1zcGFjZS4gMikgRU5GQSBoaXN0b2dyYW0gdmlzdWFsaXphdGlvbnMgb2YgbWFyZ2luYWxpdHkgYW5kIHNwZWNpYWxpemF0aW9uIGF4ZXMuIDMpIFBDQSBvZiB0b3RhbCBlLXNwYWNlIHdpdGggY29sb3JzIGNvcnJlc3BvbmRpbmcgdG8gc2V4dWFsIHZzLiBhc2V4dWFsIHBvcHVsYXRpb25zLgpgYGB7cn0KIyMjIDEpIEVORkEgc2NhdHRlcnBsb3QKI2FjY2VzcyB0aGUgcmVsZXZhbnQgdmFsdWVzIGZvciBwbG90dGluZwp0ZWN0X2h1dHRfYXNleHVhbF9kZiA8LSB0ZWN0X2h1dHRfYXNleHVhbF9lbmZhJGxpICU+JSAKICBhc190aWJibGUoKSAlPiUgCiAgYmluZF9jb2xzKHByID0gdGVjdF9odXR0X2FzZXh1YWxfZW5mYSRwcikKCgp0ZWN0X2h1dHRfc2V4dWFsX2RmIDwtIHRlY3RfaHV0dF9zZXh1YWxfZW5mYSRsaSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogIGJpbmRfY29scyhwciA9IHRlY3RfaHV0dF9zZXh1YWxfZW5mYSRwcikKCgojYXNleHVhbAplbmZhX2hleF9wbG90KHRlY3RfaHV0dF9hc2V4dWFsX2RmLCBtYXJnID0gTWFyLCBzcGVjID0gU3BlMSwgcmVwcm9fbW9kZSA9ICJBc2V4dWFsIikKCgojc2V4dWFsCmVuZmFfaGV4X3Bsb3QodGVjdF9odXR0X3NleHVhbF9kZiwgbWFyZyA9IE1hciwgc3BlYyA9IFNwZTEsIHJlcHJvX21vZGUgPSAiU2V4dWFsIikKCgojIyMgMikgRU5GQSBoaXN0b2dyYW0KI2FzZXh1YWwKaGlzdCh0ZWN0X2h1dHRfYXNleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIkFzZXh1YWwiLCBhZGogPSAwLjcsIGxpbmUgPSAtMTIpCgojc2V4dWFsCmhpc3QodGVjdF9odXR0X3NleHVhbF9lbmZhKQp0aXRsZShtYWluID0gIlNleHVhbCIsIGFkaiA9IDAuNywgbGluZSA9IC0xMikKCiMjIyAzKSBQQ0Egb2YgdG90YWwgZS1zcGFjZQp0b3RhbF9jbGltYXRlX3BjYV9wbG90KGJnX2VudiA9IHRlY3RfaHV0dF9iZ19lbnYsIGxvY3MgPSB0ZWN0X2xvYywgZ2VudXMgPSAiVGVjdGFyY2h1cyIsIHNwZWNpZXMgPSAiaHV0dG9uaSIpCgpgYGAKCgpgYGB7cn0KdGVjdF9odXR0X2xvY3NfYXNleHVhbCA8LSB0ZWN0X2xvYyAlPiUgCiAgbXV0YXRlKGxhdF9sb25nID0gc3RyX2MobGF0aXR1ZGUsIGxvbmdpdHVkZSwgc2VwID0gIl8iKSkgJT4lIAogIGZpbHRlcihzcGVjaWVzID09ICJodXR0b25pIiwgCiAgICAgICAgIHJlcHJvZHVjdGl2ZV9tb2RlID09ICJhc2V4dWFsIiwKICAgICAgICAgIWR1cGxpY2F0ZWQobGF0X2xvbmcpKSAlPiUgCiAgZHBseXI6OnNlbGVjdChsb25naXR1ZGUsIGxhdGl0dWRlKQoKdGVjdF9odXR0X2xvY3Nfc2V4dWFsIDwtIHRlY3RfbG9jICU+JSAKICBtdXRhdGUobGF0X2xvbmcgPSBzdHJfYyhsYXRpdHVkZSwgbG9uZ2l0dWRlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKHNwZWNpZXMgPT0gImh1dHRvbmkiLCAKICAgICAgICAgcmVwcm9kdWN0aXZlX21vZGUgPT0gInNleHVhbCIsCiAgICAgICAgICFkdXBsaWNhdGVkKGxhdF9sb25nKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QobG9uZ2l0dWRlLCBsYXRpdHVkZSkKCnByZWNpcF9hc2V4dWFsX3RlY3RfaHV0dCA8LSByYXN0ZXI6OmV4dHJhY3QocHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIHRlY3RfaHV0dF9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJwcmVjaXBfc3RhYmlsaXR5X3NjYWxlZCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAiYXNleHVhbCIpCgpwcmVjaXBfc2V4dWFsX3RlY3RfaHV0dCA8LSByYXN0ZXI6OmV4dHJhY3QocHJlY2lwX3N0YWJpbGl0eV9zY2FsZWQsIHRlY3RfaHV0dF9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gInByZWNpcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJzZXh1YWwiKQoKcHJlY2lwX2RmX3RlY3RfaHV0dCA8LSBiaW5kX3Jvd3MocHJlY2lwX2FzZXh1YWxfdGVjdF9odXR0LCBwcmVjaXBfc2V4dWFsX3RlY3RfaHV0dCkKCmdncGxvdChkYXRhID0gcHJlY2lwX2RmX3RlY3RfaHV0dCwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHByZWNpcF9zdGFiaWxpdHlfc2NhbGVkLCBjb2xvciA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCgoKdGVtcF9hc2V4dWFsX3RlY3RfaHV0dCA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCB0ZWN0X2h1dHRfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAidGVtcF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCnRlbXBfc2V4dWFsX3RlY3RfaHV0dCA8LSByYXN0ZXI6OmV4dHJhY3QodGVtcF9zdGFiaWxpdHlfc2NhbGVkLCB0ZWN0X2h1dHRfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJ0ZW1wX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgp0ZW1wX2RmX3RlY3RfaHV0dCA8LSBiaW5kX3Jvd3ModGVtcF9hc2V4dWFsX3RlY3RfaHV0dCwgdGVtcF9zZXh1YWxfdGVjdF9odXR0KQoKZ2dwbG90KGRhdGEgPSB0ZW1wX2RmX3RlY3RfaHV0dCwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IHRlbXBfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKb3ZlcmFsbF9hc2V4dWFsX3RlY3RfaHV0dCA8LSByYXN0ZXI6OmV4dHJhY3Qob3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkLCB0ZWN0X2h1dHRfbG9jc19hc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAib3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCm92ZXJhbGxfc2V4dWFsX3RlY3RfaHV0dCA8LSByYXN0ZXI6OmV4dHJhY3Qob3ZlcmFsbF9zdGFiaWxpdHlfc2NhbGVkLCB0ZWN0X2h1dHRfbG9jc19zZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJvdmVyYWxsX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpvdmVyYWxsX2RmX3RlY3RfaHV0dCA8LSBiaW5kX3Jvd3Mob3ZlcmFsbF9hc2V4dWFsX3RlY3RfaHV0dCwgb3ZlcmFsbF9zZXh1YWxfdGVjdF9odXR0KQoKZ2dwbG90KGRhdGEgPSBvdmVyYWxsX2RmX3RlY3RfaHV0dCwgYWVzKHggPSByZXByb2R1Y3RpdmVfbW9kZSwgeSA9IG92ZXJhbGxfc3RhYmlsaXR5X3NjYWxlZCwgY29sb3IgPSByZXByb2R1Y3RpdmVfbW9kZSkpICsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1hZ21hIikgKwogIHRoZW1lX2RhcmsoKQoKZXZpX2FzZXh1YWxfdGVjdF9odXR0IDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZCwgdGVjdF9odXR0X2xvY3NfYXNleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkIikgJT4lIAogIG11dGF0ZShyZXByb2R1Y3RpdmVfbW9kZSA9ICJhc2V4dWFsIikKCmV2aV9zZXh1YWxfdGVjdF9odXR0IDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZCwgdGVjdF9odXR0X2xvY3Nfc2V4dWFsKSAlPiUgCiAgZW5mcmFtZShuYW1lID0gTlVMTCwgdmFsdWUgPSAiZXZpX3N0YWJpbGl0eV9zY2FsZWQiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gInNleHVhbCIpCgpldmlfZGZfdGVjdF9odXR0IDwtIGJpbmRfcm93cyhldmlfYXNleHVhbF90ZWN0X2h1dHQsIGV2aV9zZXh1YWxfdGVjdF9odXR0KQoKZ2dwbG90KGRhdGEgPSBldmlfZGZfdGVjdF9odXR0LCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gZXZpX3N0YWJpbGl0eV9zY2FsZWQsIGNvbG9yID0gcmVwcm9kdWN0aXZlX21vZGUpKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC41LCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWdtYSIpICsKICB0aGVtZV9kYXJrKCkKYGBgCgpBbm51YWwgc3RhYmlsaXR5CmBgYHtyfQpldmlfYXNleHVhbF90ZWN0X2h1dHRfYW5udWFsIDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwsIHRlY3RfaHV0dF9sb2NzX2FzZXh1YWwpICU+JSAKICBlbmZyYW1lKG5hbWUgPSBOVUxMLCB2YWx1ZSA9ICJldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwiKSAlPiUgCiAgbXV0YXRlKHJlcHJvZHVjdGl2ZV9tb2RlID0gImFzZXh1YWwiKQoKZXZpX3NleHVhbF90ZWN0X2h1dHRfYW5udWFsIDwtIHJhc3Rlcjo6ZXh0cmFjdChldmlfc3RhYmlsaXR5X3NjYWxlZF9hbm51YWwsIHRlY3RfaHV0dF9sb2NzX3NleHVhbCkgJT4lIAogIGVuZnJhbWUobmFtZSA9IE5VTEwsIHZhbHVlID0gImV2aV9zdGFiaWxpdHlfc2NhbGVkX2FubnVhbCIpICU+JSAKICBtdXRhdGUocmVwcm9kdWN0aXZlX21vZGUgPSAic2V4dWFsIikKCmV2aV9kZl90ZWN0X2h1dHRfYW5udWFsIDwtIGJpbmRfcm93cyhldmlfYXNleHVhbF90ZWN0X2h1dHRfYW5udWFsLCBldmlfc2V4dWFsX3RlY3RfaHV0dF9hbm51YWwpCgpnZ3Bsb3QoZGF0YSA9IGV2aV9kZl90ZWN0X2h1dHRfYW5udWFsLCBhZXMoeCA9IHJlcHJvZHVjdGl2ZV9tb2RlLCB5ID0gZXZpX3N0YWJpbGl0eV9zY2FsZWRfYW5udWFsLCBjb2xvciA9IHJlcHJvZHVjdGl2ZV9tb2RlKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAibWFnbWEiKSArCiAgdGhlbWVfZGFyaygpCmBgYAojIyMgVGVwYWtpcGhhc21hCk5vdGhpbmcuIE9ubHkgb25lIGxvY2FsaXR5LgoKIyMgQ29udmVuaWVuY2Ugc2NyaXB0cwoqVGhlc2Ugc2NyaXB0cyBhcmVuJ3QgY3J1Y2lhbCBmb3IgcmVwcm9kdWNpbmcgdGhpcyBhbmFseXNpcywgYnV0IHdlcmUgaGVscGZ1bCBmb3IgdmFyaW91cyByZWFzb25zLiBTb21lIG9mIHRoZXNlIGhhdmUgaGFyZC1jb2RlZCBwYXRocyBhbmQgc3VjaCwgc28gbm8gZ3VhcmFudGVlcyBmb3IgdXNlIHJpZ2h0IG91dCBvZiB0aGUgYm94LioKCgpUaGlzIHdhcyBhIHNjcmlwdCBJIHVzZWQgdG8gdGFrZSBmdWxsIGNoZWxzYSBmaWxlcywgY3JvcCB0aGVtIHRvIE5ldyBaZWFsYW5kIGV4dGVudCwgYW5kIHdyaXRlIHRoZW0gdG8gYSBmaWxlIHdpdGggbXkgcGVyc29uYWwgY29tcHV0ZXIuIEkgZG9uJ3QgaGF2ZSBtdWNoIG1lbW9yeSwgc28gdW56aXBwaW5nIHRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgdGhlbiBkZWxldGluZyB0aGUgZGlyZWN0b3J5IHRvIGZyZWUgdXAgc3BhY2UgZm9yIHRoZSBsYXJnZSBmaWxlcyB3b3JrZWQuIApgYGB7ciBldmFsPUZBTFNFfQojIyBnZXQgY2hlbHNhIGRhdGEKY2hlbHNhX2ZvbGRlciA8LSAiL1VzZXJzL2Nvbm5vcmZyZW5jaC9Ecm9wYm94L09sZF9NYWMvY2xpbWF0ZS1kYXRhL2NoZWxzYV8zMHNfYmlvIgp6aXBfZmlsZXMgPC0gbGlzdC5maWxlcyhjaGVsc2FfZm9sZGVyLCBmdWxsLm5hbWVzID0gVFJVRSkKCiMgdXNpbmcgdGhlIFVuYXJjaGl2ZXIgY29tbWFuZGxpbmUgdG9vbHMgZm9yIE1hYyB0byB1bnppcCB0aGUgN3ppcCBjaGVsc2EgbGF5ZXJzLiBSZWd1bGFyIHVuemlwKCkgZG9lcyBub3Qgd29yayB3aXRoIDd6IHppcHBlZCBmaWxlcwpmb3IgKGZpbGUgaW4gemlwX2ZpbGVzKSB7CiAgIyBzZXQgdGVtcCBkaXJlY3RvcnkKICB0ZW1wZCA8LSB0ZW1wZGlyKCkKICBzeXN0ZW0ocGFzdGUoInVuYXIiLCBmaWxlLCAiLW8iLCB0ZW1wZCkpCiAgciA8LSByYXN0ZXIobGlzdC5maWxlcyh0ZW1wZCwgcGF0dGVybiA9ICIqLnRpZiIsIGZ1bGwubmFtZXMgPSBUUlVFKSkgJT4lCiAgICBjcm9wKGV4dGVudCgxNjYsIDE3OSwgLTQ4LCAtMzQpKQogIHdyaXRlUmFzdGVyKHIsIGZpbGVuYW1lID0gcGFzdGUwKCJ+L0Rlc2t0b3AvIiwgbGlzdC5maWxlcyh0ZW1wZCwgcGF0dGVybiA9ICIqLnRpZiIpKSwgZm9ybWF0ID0gIkdUaWZmIikKICB1bmxpbmsodGVtcGQsIHJlY3Vyc2l2ZSA9IFRSVUUpCn0KYGBgCgo=